减号随列表和 breqn 消失 - 有什么解决方案吗?

减号随列表和 breqn 消失 - 有什么解决方案吗?

使用listings和时breqn,减号(或破折号,根据 unix.SX 网站的说法,关于它是什么存在一些争议)会从代码列表中消失。以下是示例:

\documentclass{article}
\pagestyle{empty}
\usepackage{breqn}
\usepackage{listings}

\begin{document}


\lstset{language=Perl}
\begin{lstlisting}
#! /usr/bin/perl -w

if ($ARGV[0] =~ /^-/) {
    print "Option given";
}
\end{lstlisting}
\end{document}

结果:

列表和breqn

更改软件包加载顺序没有帮助。 breqn确实警告说它可能会破坏其他软件包,但让两个软件包都正常工作确实很有用。如果有帮助的话,代码清单在附录中,所以发生在方程式之后,这是breqn为了提供帮助,这样我就可以愉快地重置任何改变的东西。

答案1

您的问题来自于\lstlisting喜欢将连字符减号排版为$-$,而该breqn包对数学操作太过痴迷。具体来说,它将减号的数学代码设置为"8000,这使其处于活动状态,似乎会破坏某些功能。

\documentclass{article}
\pagestyle{empty}
\mathchardef\hyphenmathcode=\mathcode`\-
\usepackage{breqn}
\usepackage{listings}

\let\origlstlisting=\lstlisting
\let\endoriglstlisting=\endlstlisting
\renewenvironment{lstlisting}
    {\mathcode`\-=\hyphenmathcode
     \everymath{}\mathsurround=0pt\origlstlisting}
    {\endoriglstlisting}

\begin{document}

\lstset{language=Perl}
\everymath{}
\begin{lstlisting}
#! /usr/bin/perl -w

if ($ARGV[0] =~ /^-/) {
    print "Option given";
}
\end{lstlisting}
\end{document}

\everymath{}\mathsurround这不是必需的,但为了达到更好的效果应该有一个。)

编辑:添加了数学代码位。我将在评论中对此编辑进行更多说明。

答案2

默认情况下,listings 在这里使用数学减号,这与 breqn 冲突。您可以更改 listings 使用的连字符符号。例如,这使用 \textminus,也适用于 breqn:

\documentclass{article}
\usepackage{listings}
\usepackage{breqn}

\begin{document}


\lstinline +ABC-ABC+ 

\makeatletter
\lst@CCPutMacro
    \lst@ProcessOther {"2D}{%
      \lst@ttfamily
         {\textminus}% used with ttfamily 
         \textminus}% used with other fonts
    \@empty\z@\@empty
\makeatother

\lstinline +ABC-ABC+

\lstset{basicstyle=\ttfamily}
\lstinline +ABC-ABC+

\end{document}

在此处输入图片描述

答案3

这是一个解决方案:

\documentclass{tufte-book}
\pagestyle{empty}
\usepackage{listings}
\usepackage{breqn}
\begin{document}

\normalfont

\makeatletter
\texttt{\meaning\lst@InputCatcodes\relax}
\makeatother

\lstset{language=Perl,escapeinside={(*@}{@*)}}
\begin{lstlisting}
#! /usr/bin/perl -w

if ($ARGV[0] =~ /^(*@-@*)/) {
    print "Option given";
}
\end{lstlisting}

\end{document}

这确实是字体问题。字体中的 - 符号在列表中是活动字符。(参见meaning)。但是,如果您将其转义,它就会正确catcode,错误就会消失。您可以使用有趣的眼睛进行转义:) (*@ @*),然后您可以插入任何您想要的内容。也许其他人可以提出更简单的解决方案,因为我想总是必须转义符号很麻烦。

我使用 MikTeX 进行编译。

编辑

另一个方法是使用listings lstnewenvironment命令定义一个新环境来保护来自其他包的定义:

\lstnewenvironment{perl}[1][]
  {\lstset{language=Perl}\lstset{%
   #1
}}
{}

这也有效,

使用: \begin{perl}...\end{perl}

这个解决方案与 Harald 给出的解决方案非常相似。

答案4

-我的代码示例中的任何减号运算符 ( )lstlisting均未显示。我得到的是“未定义控制序列。n--“ 错误。

之前的代码,缺少减号

无论出于什么原因,这都解决了它(它会显示一个大破折号,但这可以快速解决问题):

1-添加包minted(不使用它):

\usepackage{minted}

2-在每次构建时调用 LaTeX -shell-escape flag

按照上述步骤在这个答案中作者:hpesoj626:

在 TeXstudio 中

选项>配置TeXStudio>构建

在里面用户命令框,单击+Add按钮并在第一个单元格中为命令添加名称,然后在第二个单元格中说出pdflatex -shell-escape命令。pdflatex -synctex=1 -interaction=nonstopmode --shell-escape %.tex

然后你就可以看到菜单中列出的命令

工具 > 用户

单击要运行的命令。

当我运行我的代码时,各部分的减号lstlisting就出现了。

代码如下,显示缺点

相关内容