逐字抑制涉及“{”和“}”的 Fira 代码连字符

逐字抑制涉及“{”和“}”的 Fira 代码连字符

我正在尝试改进当前的实现(v0.1b)lstfiracode包。特别是,我希望实现对面的在代码列表中使用带有连字符的 Fira Code 字体

以下是我的想法

% !TeX program = XeLaTeX
% !TeX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage{fontspec}
\setmonofont{FiraCode-Regular.otf}[ % https://github.com/tonsky/FiraCode/releases
  Ligatures=Common,Contextuals=Alternate
]

\makeatletter
% Snippets of lstfiracode.sty, v0.1b
\let\lstfiracode@verbatim@nolig@list\verbatim@nolig@list
\newcommand*\ActivateVerbatimLigatures{%
  \def\verbatim@nolig@list{\do\`\do\,\do\'}%
}
\newcommand*\DeactivateVerbatimLigatures{%
  \expandafter\def\expandafter\verbatim@nolig@list\expandafter{%
    \lstfiracode@verbatim@nolig@list
    \do\w\do\*\do\/\do\:\do\=\do\!\do\~\do\[%
    \do\#\do\(\do\?\do\_\do\.\do\;\do\&\do\|%
    \do\+\do\$\do\@\do\%\do\]% Do "7B and "7D, how?
  }%
}
\makeatother

\begin{document}

\ActivateVerbatimLigatures
\begin{verbatim}
A<-www>>=B#{C|}D
\end{verbatim}

\DeactivateVerbatimLigatures
\begin{verbatim}
A<-www>>=B#{C|}D
\end{verbatim}

\end{document}

样本

如上例所示,我无法弄清楚如何\do\{\do\}

据我所知,简单地\do\{\do\}弄乱类别代码,结果是一个大⚠。然而,结果\do\#很好,即使在之前和之前\do@noligs已经#激活。\def~{\leavevmode\kern\z@\char`#1}\do

{我应该怎么做才能抑制涉及和}(和\,以防万一)的 Fira 代码连字符?

答案1

有几个相关问题。

总之,

  • 如果您同意全局禁用 Fira Mono 字体的连字,只需使用上面的第 4 个问题(如果是 XeLaTeX/LuaLaTeX)或上面的第 5 个问题(PDFLaTeX)

否则,请继续阅读。


正如 egreg 在评论中提到的,这是因为\@xverbatim宏的匹配。

source2e 截图

我能想到的唯一方法是\@xverbatim在需要时有选择地重新定义。

% !TeX program = XeLaTeX
% !TeX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage{fontspec}
\setmonofont{FiraCode-Regular.ttf}[ % https://github.com/tonsky/FiraCode/releases
Contextuals=Alternate
]

\makeatletter
% Snippets of lstfiracode.sty, v0.1b
\let\lstfiracode@verbatim@nolig@list\verbatim@nolig@list
\usepackage{precattl}
\precattlExec{
\newcommand*\ActivateVerbatimLigatures{%
  \gdef\@xverbatim##1\cO\\end\cO\{verbatim\cO\}{##1\end{verbatim}}%
  \def\verbatim@nolig@list{\do\`\do\,\do\'}%
}
\newcommand*\DeactivateVerbatimLigatures{%
  \gdef\@xverbatim##1\cO\\end\cA\{verbatim\cA\}{##1\end{verbatim}}%
  \expandafter\def\expandafter\verbatim@nolig@list\expandafter{%
    \lstfiracode@verbatim@nolig@list
    \do\w\do\*\do\/\do\:\do\=\do\!\do\~\do\[%
    \do\#\do\(\do\?\do\_\do\.\do\;\do\&\do\|%
    \do\+\do\$\do\@\do\%\do\]\do\{\do\}%
  }%
}
}
\makeatother

\begin{document}

\ActivateVerbatimLigatures
\begin{verbatim}
A<-www>>=B#{C|}D
\end{verbatim}

\DeactivateVerbatimLigatures
\begin{verbatim}
A<-www>>=B#{C|}D
\end{verbatim}

\end{document}

当然,这会对verbatim环境进行修补,因此如果在任何时候修改了 LaTeX 内核,这就会严重破坏。

解释

基本上,的正常定义\@xverbatim是:

\gdef\@xverbatim#1\cO\\end\cO\{verbatim\cO\}{#1\end{verbatim}}

在哪里\cO\⟨特点⟩代表其他-category 标记与 charcode = 该字符。

与文档匹配,直到看到指定的标记列表。

{}被激活时,您需要将定义修改为:

\gdef\@xverbatim#1\cO\\end\cA\{verbatim\cA\}{#1\end{verbatim}}

在哪里\cA\⟨特点⟩代表积极的-category 标记与 charcode = 该字符。


如果您不想使用我的包precattl,还有其他方法可以插入奇怪的 catcode 令牌。一种方法是使用 catcode 更改技巧。

% !TeX program = XeLaTeX
% !TeX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage{fontspec}
\setmonofont{FiraCode-Regular.ttf}[ % https://github.com/tonsky/FiraCode/releases
Contextuals=Alternate
]

\makeatletter
% Snippets of lstfiracode.sty, v0.1b

\let\lstfiracode@verbatim@nolig@list\verbatim@nolig@list

\begingroup \catcode `|=0 \catcode `[=1
\catcode `]=2 \catcode `\{=12 \catcode `\}=12
\catcode `\\=12
|gdef|ActivateVerbatimLigatures[%
  |gdef|@xverbatim##1\end{verbatim}[##1|end[verbatim]]%
  |def|verbatim@nolig@list[|do|`|do|,|do|']%
]

|catcode `|{|active
|catcode `|}|active
|gdef|DeactivateVerbatimLigatures[%
  |gdef|@xverbatim##1\end{verbatim}[##1|end[verbatim]]%
  |expandafter|def|expandafter|verbatim@nolig@list|expandafter[%
    |lstfiracode@verbatim@nolig@list
    |do|w|do|*|do|/|do|:|do|=|do|!|do|~|do|[%
    |do|#|do|(|do|?|do|_|do|.|do|;|do|&|do||%
    |do|+|do|$|do|@|do|%|do|]|do|{|do|}%
  ]%
]
|endgroup
\makeatother

\begin{document}

\ActivateVerbatimLigatures
\begin{verbatim}
A<-www>>=B#{C|}D
\end{verbatim}

\DeactivateVerbatimLigatures
\begin{verbatim}
A<-www>>=B#{C|}D
\end{verbatim}

\end{document}

另一种是使用\lowercase诡计。

% !TeX program = XeLaTeX
% !TeX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage{fontspec}
\setmonofont{FiraCode-Regular.ttf}[ % https://github.com/tonsky/FiraCode/releases
Contextuals=Alternate
]

\makeatletter
% Snippets of lstfiracode.sty, v0.1b
\let\lstfiracode@verbatim@nolig@list\verbatim@nolig@list

\begingroup
\catcode`X\active
\catcode`Y\active
\lccode`[=`{
\lccode`]=`}
\lccode`X=`{
\lccode`Y=`}
\lccode`/=`\\
\lowercase{\endgroup
\newcommand*\ActivateVerbatimLigatures{%
  \gdef\@xverbatim##1/end[verbatim]{##1\end{verbatim}}
  \def\verbatim@nolig@list{\do\`\do\,\do\'}%
}
\newcommand*\DeactivateVerbatimLigatures{%
  \gdef\@xverbatim##1/endXverbatimY{##1\end{verbatim}}
  \expandafter\def\expandafter\verbatim@nolig@list\expandafter{%
    \lstfiracode@verbatim@nolig@list
    \do\w\do\*\do\/\do\:\do\=\do\!\do\~\do\[%
    \do\#\do\(\do\?\do\_\do\.\do\;\do\&\do\|%
    \do\+\do\$\do\@\do\%\do\]\do\{\do\}%
  }%
}
}

\makeatother

\begin{document}

\ActivateVerbatimLigatures
\begin{verbatim}
A<-www>>=B#{C|}D
\end{verbatim}

\DeactivateVerbatimLigatures
\begin{verbatim}
A<-www>>=B#{C|}D
\end{verbatim}

\end{document}

相关内容