我正在尝试改进当前的实现(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
有几个相关问题。
- LaTeX 逐字环境中 \do@noligs 的用途
- 如何在逐字环境中启用连字?
- 在代码列表中使用带有连字符的 Fira Code 字体 (关于如何使能够连字符(通过清空列表)
- 我怎样才能完全抑制连字?(如何在 XeLaTeX 和 LuaLaTeX 中抑制连字)
- 如何防止 LaTeX 创建 en-dash 和 em-dash?(如何抑制 PDFLaTeX 中的连字)
总之,
- 如果您同意全局禁用 Fira Mono 字体的连字,只需使用上面的第 4 个问题(如果是 XeLaTeX/LuaLaTeX)或上面的第 5 个问题(PDFLaTeX)
否则,请继续阅读。
正如 egreg 在评论中提到的,这是因为\@xverbatim
宏的匹配。
我能想到的唯一方法是\@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}