Listings 和 Babel(对于某些语言)破坏了连字符

Listings 和 Babel(对于某些语言)破坏了连字符

在以下文档中

\documentclass{article}
%\usepackage[german]{babel} % also try english, ngerman and dutch
\usepackage{listings}
\begin{document}
\thispagestyle{empty}
\begin{minipage}{1em}

und/oder % and/or on german; shouldn't be hyphenated

\medskip
n und/oder % same es above, but not the first word in paragraph

\medskip
und/""oder % "" is a shorthand in some languages, provided by babel. It allows a linebreak without hyphen
\end{minipage}
\end{document}

我在连字符方面遇到了问题。一旦两个包都加载了——顺序无关紧要——/似乎会被视为普通字母,至少在激活某些语言的情况下(例如德语、德语或荷兰语)。只加载这些语言而不激活它们,则没有效果。通常,整个术语und/oder不应该被连字符连接。有趣的是,即使是 pdflatex 和 lualatex 也会产生不同的结果:lualatex 会将段落的第一个单词连字符连接起来(比较图像中的第一行和第二行)。

有人知道这是什么原因吗?我以前没有注意到这种行为,而且我几乎在每个文档中都使用这两个包。以下是几种组合的结果。

答案1

以下是文件中的问题.dtx

   5746 % \begin{macro}{\lst@RestoreCatcodes}
   5747 % To load the kernel, we will change some catcodes and lccodes. We restore them
   5748 % at the end of package loading. \lsthelper{Dr.~Jobst~Hoffmann}{2000/11/17}
   5749 % {incompatibility with typehtml package} reported an incompatibility with the
   5750 % \packagename{typehtml} package, which is resolved by |\lccode`\/`\/| below.
   5751 %    \begin{macrocode}
   5752 \def\lst@RestoreCatcodes#1{%
   5753     \ifx\relax#1\else
   5754         \noexpand\catcode`\noexpand#1\the\catcode`#1\relax
   5755         \expandafter\lst@RestoreCatcodes
   5756     \fi}
   5757 \edef\lst@RestoreCatcodes{%
   5758     \noexpand\lccode`\noexpand\/`\noexpand\/%
   5759     \lst@RestoreCatcodes\"\^^I\^^M\~\^^@\relax
   5760     \catcode12\active}
   5761 %    \end{macrocode}

环境

\lccode`\/`\/

也许可以解决 的问题typehtml,但却会产生连字符的问题,而这个问题会更加严重。

就连字而言,TeX 将单词视为类别代码为 11 或 12 的字符序列,其中 不为零\lccode。因此零\lccode会停止连字。另一方面,如果/被分配代码 47,则会考虑它,并且可以找到连字模式。由于

und/oder

是一个八个字符的“单词”,并且允许在un和之间使用连字符d,并且o和之间der也使用这些连字符点。

你可以通过以下方式解决问题

\documentclass{article}
\usepackage[ngerman]{babel} % also try english, ngerman and dutch
\usepackage{listings}
\usepackage{etoolbox}
\makeatletter
\lccode`\/=0
\patchcmd{\lst@RestoreCatcodes}{\lccode `\/`\/}{}{}{}
\makeatother

\begin{document}
\thispagestyle{empty}
\begin{minipage}{1em}
und/oder % and/or on german; shouldn't be hyphenated

\medskip
n und/oder % same es above, but not the first word in paragraph

\medskip
und/""oder % "" is a shorthand in some languages, provided by babel. It allows a linebreak without hyphen
\end{minipage}

\makeatletter

\end{document}

这将从相关命令中删除有问题的设置。

相关内容