CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
972 stars 124 forks source link

xeCJK: Verbatim里不应该自动加空格 #580

Closed zhsj closed 3 years ago

zhsj commented 3 years ago
\documentclass{article}
\usepackage{fancyvrb}
\usepackage[utf8]{inputenc}
\usepackage{xeCJK}

\begin{document}

{
\CJKsetecglue{}
\begin{Verbatim}
"你好"
\end{Verbatim}
}

{
\begin{Verbatim}
"你好"
\end{Verbatim}
}

{
"你好"
}

\end{document}

使用 xelatex 编译后渲染出来的效果是

image

我认为Verbatim环境里不应该自动加空格,不需要用户手动设置 \CJKsetecglue{}

原始问题 https://github.com/sphinx-doc/sphinx/issues/9414 在使用 sphinx 编译文档时,发现渲染出来的代码片段里有多余的空格。

sikouhjw commented 3 years ago

已知问题:https://github.com/CTeX-org/ctex-kit/issues/331

zhsj commented 3 years ago

但是问题好像并没有修复呀,是不在xeCJK修复的范围吗? :cry:

另外,如果不在 xeCJK 中修复的话,在下游软件(比如sphinx)中推荐的修复方法是哪个呀? #331 中好像提到了几种方案。。

sikouhjw commented 3 years ago

但是问题好像并没有修复呀,是不在xeCJK修复的范围吗? 😢

我觉得是不好修,因为这个环境不是内核里有的。

另外,如果不在 xeCJK 中修复的话,在下游软件(比如sphinx)中推荐的修复方法是哪个呀? #331 中好像提到了几种方案。。

在导言区对环境打补丁。

stone-zeng commented 3 years ago

可以考虑给 fancyvrb 包单独打个补丁的。

muzimuzhi commented 3 years ago

一种补丁方式

\documentclass{article}
\usepackage{fancyvrb}
% \usepackage{fvextra}
\usepackage{xeCJK}

\makeatletter
\ExplSyntaxOn
\AtBeginDocument
  {
    \xeCJK_if_package_loaded:nTF {fvextra}
      {
        \tl_gput_left:Nn \FV@FormattingPrep@PostHook
          { \__xeCJK_verb_font_hook: }
      }
      {
        \xeCJK_if_package_loaded:nT {fancyvrb}
          {
            \tl_gput_right:Nn \FV@FormattingPrep
              { \__xeCJK_verb_font_hook: }
          }
      }
  }
\ExplSyntaxOff
\makeatother

\begin{document}

normal: "你好"

in \verb|\verb| and \verb|verbatim|
\verb|"你好"|, \begin{verbatim}
"你好"
\end{verbatim}

in \verb|\Verb| and \verb|Verbatim|
\Verb|"你好"|, \begin{Verbatim}
"你好"
\end{Verbatim}

\end{document}

image

zhsj commented 3 years ago

多谢。 @stone-zeng 在 https://github.com/sphinx-doc/sphinx/issues/9414#issuecomment-875676739 上的 comment 好像比较简单 :joy:

muzimuzhi commented 3 years ago

这里考虑得更多,例如

muzimuzhi commented 3 years ago

直接 patch fancyvrb 里和 \verbatim@font 对应的 \FV@SetupFont 也是个办法

\documentclass{article}
\usepackage{fancyvrb}
\usepackage{xeCJK}

\makeatletter
\ExplSyntaxOn
\AtBeginDocument
  {
    \xeCJK_if_package_loaded:nT {fancyvrb}
      {
        \tl_put_right:Nn \FV@SetupFont
          { \__xeCJK_verb_font_hook: }
      }
  }
\ExplSyntaxOff
\makeatother

\begin{document}
normal: "你好"

in \verb|\verb| and \verb|verbatim|
\verb|"你好"|, \begin{verbatim}
"你好"
\end{verbatim}

in \verb|\Verb| and \verb|Verbatim|
\Verb|"你好"|, \begin{Verbatim}
"你好"
\end{Verbatim}

\end{document}