![最简单的解决方案](https://linux22.com/image/387547/%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.png)
我最近开始使用 LuaLaTeX,并尝试listings
为 C++ 设置自定义样式。考虑以下 MWE:
\documentclass{scrartcl}
\usepackage{fontspec}
\usepackage{xcolor}
\usepackage{listings}
\newfontfamily{\firaseries}{Fira Code}
\lstdefinestyle{mStyle}{
language=C++,
basicstyle=\footnotesize\firaseries,
commentstyle=\color{red}
}
\lstset{style=mStyle}
\begin{document}
Default font text with *.
\firaseries This is text in Fira Code with *.
\begin{lstlisting}
Listing text with *.
/* This is a comment. */
This should not be red.
\end{lstlisting}
\end{document}
正如您所看到的,*
列表中使用的字符太少了。
为了修复此问题,我将这一行添加到我的样式定义中:
literate={*}{{\firaseries*}}1
这样可以得到所需的垂直位置,但不幸的是,它又产生了一个新问题:现在多行注释后的文本也是红色的。
我将非常感激任何关于如何解决此问题的指点。
答案1
虽然@UlrikeFischer 的回答解决了OP,仍然值得一提的是隐藏的陷阱考虑一下 OP 中的以下“增强”示例:
\documentclass{scrartcl}
\usepackage{fontspec,xcolor,listings}
\newfontfamily\firaseries{Fira Code}
\lstdefinestyle{LeonStyle}{
language=C++,
basicstyle=\footnotesize\firaseries,
commentstyle=\color{red}
}
\lstset{style=LeonStyle}
\begin{document}
\begin{lstlisting}
Listing text with *.
C++ a<=b c=2-1
/* This is a comment. */
This should not be red.
\end{lstlisting}
\end{document}
连字符减号也是错误的。事实上,它被包替换为数学模式$-$
减号listings
。
最简单的解决方案
不要Fira Code
通过加载\newfontfamily
。相反,通过 加载字体\setmonofont
并使用basicstyle=\ttfamily
。这表示Fira Code
为等宽字体,并防止listings
替换某些符号。
\documentclass{scrartcl}
\usepackage{fontspec,xcolor,listings}
\setmonofont{Fira Code}
\lstdefinestyle{LeonStyle}{
language=C++,
basicstyle=\footnotesize\ttfamily,
commentstyle=\color{red}
}
\lstset{style=LeonStyle}
\begin{document}
\begin{lstlisting}
Listing text with *.
C++ a<=b c=2-1
/* This is a comment. */
This should not be red.
\end{lstlisting}
\end{document}
更精细的解决方案
在过去的几天里,我编写了一个小包lstfiracode
(无耻的插件)。它主要是为了利用环境Fira Code
中的编程连字符而设计的lstlisting
。如果您使用的是Fira Code
,那么您可能需要连字符(否则您可以只使用Fira Mono
)。以下是您将如何实现lstfiracode
:
\documentclass{scrartcl}
\usepackage{fontspec,xcolor,listings}
\usepackage{lstfiracode} % https://ctan.org/pkg/lstfiracode
\setmonofont{Fira Code}[Ligatures=Common,Contextuals=Alternate]
\lstset{
language=C++,
style=FiraCodeStyle,
basicstyle=\footnotesize\ttfamily,
commentstyle=\color{red}
}
\begin{document}
\begin{lstlisting}
Listing text with *.
C++ a<=b c=2-1
/* This is a comment. */
This should not be red.
\end{lstlisting}
\end{document}
这lstfiracode
软件包现已在 CTAN 上发布(2018/12/17)。它将在未来几天内在所有镜像和主要 TeX 发行版上可用。尽情享受吧!:)
答案2
您可以像这样升起星号:
\documentclass{scrartcl}
\usepackage{fontspec}
\usepackage{xcolor}
\usepackage{listings}
\newfontfamily{\firaseries}{Fira Code}
\lstdefinestyle{mStyle}{
language=C++,
basicstyle=\footnotesize\firaseries,
commentstyle=\color{red}
}
\lstset{style=mStyle}
\makeatletter
\lst@CCPutMacro
\lst@ProcessOther {"2A}{%
\lst@ttfamily
{*}% used with ttfamily
{\raisebox{1ex}{\textasteriskcentered}}}% used with other fonts
\@empty\z@\@empty
\makeatother
\begin{document}
Default font text with *.
\firaseries This is text in Fira Code with *.
\begin{lstlisting}
Listing text with *.
/* This is a comment. */
This should not be red.
\end{lstlisting}
\end{document}
类似这样的方法也可以(或者你可以将它与 \raisebox 结合起来):
\makeatletter
\lst@CCPutMacro
\lst@ProcessOther {"2A}{%
\lst@ttfamily
{*}% used with ttfamily
{*}}% used with other fonts
\@empty\z@\@empty
\makeatother