Fira 代码(可通过其GitHub 发布页面)不仅提供了花哨的编程连字符(参见在代码列表中使用带有连字符的 Fira Code 字体),但也包含上下文替换。例如,冒号字符 :
通常相对于小写字母垂直对齐,因此当它放在大写字母和/或衬线数字之间时,它会显得不对齐。但 Fira Code,当上下文替代项已启用,可以将小写友好型替换 :
为大写友好型。
这上下文替代项功能在环境中不起作用lstlisting
。对于连字,lstfiracode
(无耻的插件),但如何才能获得如上所述的其余上下文替换呢?
\documentclass{article}
\usepackage{fontspec}
\setmonofont{FiraCode-Regular.otf}[
Contextuals=Alternate
]
\usepackage{listings}
\lstset{basicstyle=\ttfamily}
\makeatletter
\renewcommand*\verbatim@nolig@list{}
\makeatother
\begin{document}
\noindent
With \verb|verbatim|:
\begin{verbatim}
0xff 0xFF % x is contextually substituted
a-c A-C % - is contextually substituted
e+g 1+2 % + is contextually substituted
i*j 3*4 % * is contextually substituted
m:n 5:6 % : is contextually substituted
\end{verbatim}
With \verb|lstlisting|:
\begin{lstlisting}
0xff 0xFF
a-c A-C
e+g 1+2
i*j 3*4
m:n 5:6
\end{lstlisting}
\end{document}
答案1
如果使用 \showoutput 检查输出,您会发现 listings 在字形之间插入了内容:空格(粘连)和 \hbox。两者都会干扰上下文替换。
避免这种情况的可能方法是:
- 识字如你的猪圈
columns=fullflexible
避免胶水进入- 将某些输入声明为字母以避免列表将其分开。
每一个都会对关键词列表等的处理产生副作用。
\documentclass{article}
\usepackage{fontspec}
\setmonofont{FiraCode-Regular.otf}[
Contextuals=Alternate
]
\usepackage{listings}
\lstset{basicstyle=\ttfamily}
\makeatletter
\renewcommand*\verbatim@nolig@list{}
\makeatother
\begin{document}
\showoutput
\begin{minipage}{0.3\linewidth}
\begin{lstlisting}
0xff 0xFF
a-c A-C
i*j 3*4
m:n 5:6
\end{lstlisting}
\end{minipage}
\begin{minipage}{0.3\linewidth}
\lstset{
literate={0xff}{{0xff}}4,
}
\begin{lstlisting}
0xff 0xFF
a-c A-C
i*j 3*4
m:n 5:6
\end{lstlisting}
\end{minipage}
\begin{minipage}{0.3\linewidth}
\lstset{
columns=flexible,
alsoletter={0,*,-}
}
\begin{lstlisting}
0xff 0xFF
a-c A-C
i*j 3*4
m:n 5:6
\end{lstlisting}
\end{minipage}
\end{document}