Closed duskmoon314 closed 2 years ago
meta
大部分 ligature 都未启用的样子。我目前不是很清楚原因何在。
建议贴上错误和正确输出的截图,甚至在截图里标注问题的具体位置,方便他人直接看出差别。不要只用文字描述。
<-
和 ->
字符组合没有应用 ligature。从 ctex
包简化为 xeCJK
。xeCJK
对中文的特殊处理(\xeCJKsetup{xeCJKactive=false}
),问题消失。确认和 xeCJK
有关。<> <->
或这些符号由 \char
输入时,问题消失,在中间插入空的 {}
时(<{}> <{}-{}>
),问题复现 。如果代码里没有中文,直接对相应环境关闭 xeCJK
的中文处理即可:\AddToHook{env/Verbatim/begin}{\xeCJKsetup{xeCJKactive=false}}
可以在 minted
里重定义 \PYGxxx
相关命令,改成需要一个参数,吃掉空的大括号。例如原来是 \def\PYGZlt{\char`\<}
(lt = less than),重定义成 \def\PYGZlt#1{\char`\<}
。因为 minted
已经有一个 patch \PYGZsq
(sq = single quote) 的内部宏 \minted@patch@PYGZsq
,可以把需要的重定义加进去。
pygments
项目,pygments/formatters/latex.py
。
\PYGZxx
等命令,尝试解决% see https://tex.stackexchange.com/a/294369
\begin{filecontents}[noheader]{ligatures.txt}
.= .- := =:=
== != === !== =/=
<<- <-- <- <-> -> --> ->>
<=< <<= <== <=> => ==> =>> >=>
>>= >>- >- -< -<< =<<
<~~ <~ ~~~ ~> ~~>
<<< << <= <> >= >> >>>
<| <|> |>
<$ <$> $>
<+ <+> +>
<* <*> *>
\\ \\\ {- -} // ///
/* /** **/ */
</ <!-- www --> />
0xF 9:45 m-x *ptr
;; ;;; :: ::: !! !!!
?? ??? %% %%% && &&&
|| ||| .. ... ..< []
-- --- ++ +++ ** ***
~= ~- -~ =~ ~@
^= ?= /= /== |= ||=
## ### ####
#{ #[ #( #? #_ #_(
a*b a*A B*b A*B *a *A a* A*
a-b a-A B-b A-B -a -A a- A-
a+b a+A B+b A+B +a +A a+ A+
a:b a:A B:b A:B :a :A a: A:
\end{filecontents}
\documentclass[landscape]{article}
\usepackage[margin=1in]{geometry}
\usepackage{minted}
\usepackage{multicol}
\usepackage{xeCJK}
% see https://github.com/gpoore/minted/issues/335
\setmonofont{Fira Code}[Contextuals={Alternate},CharacterVariant={25,32}]
\renewcommand{\columnseprule}{.4pt}
\makeatletter
\def\mintedPygPatches{%
% insert \minted@patch@PYG
\makeatletter
\apptocmd\minted@patch@PYGZsq{\minted@patch@PYG}{}{\PatchFailed}%
\makeatother
% repatch \PYGZsq
\begingroup
\catcode`\'=\active
\gdef\minted@patch@PYGZsq@i{\gdef\PYGZsq####1{'}}% does \PYGZsq need \gdef?
\endgroup
% patch other \PYGZxx commands,
% - before: \def\PYGZbs{\char`\\}
% - after: \def\PYGZbs#1{\char`\\}
% Command name list is excerpted from default.pygstyle, or
% https://github.com/pygments/pygments/blob/master/pygments/formatters/latex.py
\newcommand\minted@patch@PYG{%
\@for\pygname:=bs,us,ob,cb,ca,am,lt,gt,sh,pc,dl,hy,dq,ti,at,lb,rb\do{%
\csxdef{PYGZ\pygname}####1{%
\unexpanded\expandafter\expandafter\expandafter{%
\csname PYGZ\pygname\endcsname}}}}%
}
\makeatother
\begin{document}
\begin{multicols}{3}
\subsection*{xeCJKactive=false}
\xeCJKsetup{xeCJKactive=false}
\inputminted{haskell}{ligatures.txt}
\columnbreak
\subsection*{xeCJKactive=true}
\xeCJKsetup{xeCJKactive=true}
\inputminted{haskell}{ligatures.txt}
\columnbreak
\subsection*{xeCJKactive=true + PYG patches}
\xeCJKsetup{xeCJKactive=true}
\mintedPygPatches
\inputminted{haskell}{ligatures.txt}
\end{multicols}
\end{document}
为什么 xeCJKactive=true
时,<>
和 <{}>
不同:
xeCJK
把输入分成了不同的类,<
和 >
是 Default
,-
是 NormalSpace
,{}
是特殊的 Boundary
。xeCJK
会在输入之间,插入代码,于是 <{}
变成 < <Default-to-Boundary toks> {}
, -{}
变成 - {NormalSpace-to-Boundary toks} {}
,这些插入的代码妨碍了 ligature 的应用。感谢您的帮助!
我在使用 minted 和 FiraCode 字体来渲染代码块。但我发现 FiraCode 的 ligature 表现在加入
\usepackage[UTF8]{ctex}
后和使用\usepackage{fontspec}
的英文环境不一致,大部分 ligature 都未启用的样子。我目前不是很清楚原因何在。一个简单的例子:
注:似乎在 verbatim 环境中,中英文是同样的效果。
REF: