如何在 lstlisting 中启用上下文替换?

如何在 lstlisting 中启用上下文替换?

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}

在此处输入图片描述

相关内容