列表中的连字符问题

列表中的连字符问题

问题是,在内联列表“ABC-ABC”中,连字符消失了。如果我删除 literate=... 参数,它就可以正常工作,但我需要它,因为我想通过使用“-”指定手动连字符标记来环绕较长的内联代码。我该如何解决这个问题?

另一个奇怪的事情是,内联列表仅适用于 \newcommand,如示例中的第二部分所示。这是一个错误吗?

\documentclass{article}

\usepackage{listings}

\lstdefinestyle{Inline}
{
    literate={\-}{}{0\discretionary{-}{}{}}
}
\newcommand{\code}[1]{\lstinline[style=Inline]{#1}}

\begin{document}
\code{ABC-ABC}\\
\code{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABC\-ABC}\\[1cm]
Bug in listings???\\
\code{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABC\-ABC}\\
\lstinline[style=Inline]{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABC\-ABC}
\end{document}

答案1

有两个问题:

  • \--与 中相同literate,如果要在连字符前加反斜杠,则需要用反斜杠对反斜杠进行转义。连字符不需要用反斜杠进行转义:\\-捕获反斜杠和连字符。

    来自文档

    4.1 如何阅读参考资料
    ...
    5. 如果要输入特殊字符之一,则必须   使用反斜杠转义{}#%\该字符。这意味着您必须为   单个字符“右括号”编写代码,但当然不能为结束参数   字符编写代码。
    \}

  • listings读取已更改 catcode 的代码。如果代码\lstinline已作为参数读取,则参数将被标记化,catcode 更改不会产生影响,请参阅 Werner 的评论

    \newcommand*{\code}{\lstinline[style=Inline]}
    

例子:

\documentclass{article}
\usepackage[a5paper]{geometry}

\usepackage{listings}

\lstdefinestyle{Inline}
{
    literate={\\-}{}{0\discretionary{-}{}{}}
}
\newcommand{\code}{\lstinline[style=Inline]}

\begin{document}
\noindent
\code{ABC-ABC}\\
\code{AAAAAAAAAAAAAAAAAAAAAAAAAABC\-ABC}\\
\code{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABC\-ABC}
\end{document}

结果

相关内容