在以下文档中
\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}
这将从相关命令中删除有问题的设置。