最简单的解决方案

最简单的解决方案

我最近开始使用 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}

这将产生以下输出:First PDF Output

正如您所看到的,*列表中使用的字符太少了。

为了修复此问题,我将这一行添加到我的样式定义中:

literate={*}{{\firaseries*}}1

这样可以得到所需的垂直位置,但不幸的是,它又产生了一个新问题:现在多行注释后的文本也是红色的。

Second PDF Output

我将非常感激任何关于如何解决此问题的指点。

答案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}

HiddenProblems

连字符减号也是错误的。事实上,它被包替换为数学模式$-$减号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}

ttfamily


更精细的解决方案

在过去的几天里,我编写了一个小包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}

ligatures

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

相关内容