使用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
为了提供帮助,这样我就可以愉快地重置任何改变的东西。
答案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
就出现了。