作为这个问题,我想问一下:如何正确添加连字符例外包含下划线?
注意:之前的问题(我发现了一些)已经解决不知何故修复连字符,即使这意味着要破坏要连字符的每一个单词。但我需要一个解决方案,它不需要我在将文本交给 LaTeX 之前对其进行预处理(从 LaTeX 引擎的角度来看)。此外,修改这些的每个实例似乎违反了我在大学期间最初开始使用 LaTeX 时听到的那些说教之一:LaTeX 使您不必再进行微观管理,您只需输入文本,与 LaTeX 协同的文档类将完成剩下的工作。
\documentclass{article}
\usepackage[ngerman,english]{babel}
\usepackage{xparse}
\usepackage{microtype}
\usepackage[T1]{fontenc}
\DeclareRobustCommand\funcfamily
{\fontencoding{OT1}\fontfamily\ttdefault\selectfont}
\hyphenation{
An-Obscenely-Long-Function-Name
Another_Name_With_Under-scores
}
\NewDocumentCommand{\funcref}{mo}{{%
\funcfamily\hyphenchar\font=130
\hyperref[#1]{#1(\IfValueTF{#2}{#2}{})}}}
\usepackage{hyperref}
\begin{document}
AnObscenelyLongFunctionName AnObscenelyLongFunctionName AnObscenelyLongFunctionName
AnObscenelyLongFunctionName AnObscenelyLongFunctionName
foo bar baz \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName}
\end{document}
pdfLaTeX 在第 11 行出现故障:
Improper \hyphenation will be flushed. Another_
Improper \hyphenation will be flushed. Another_Name_
Improper \hyphenation will be flushed. Another_Name_With_
一开始我以为这个答案针对题为“带下划线的单词的连字符”的问题的回答可能会帮助我,但实际上并没有。事实上,我也尝试过\usepackage{underscore}
。
我是否使用
\hyphenation{
An-Obscenely-Long-Function-Name
Another_Name_With_Under-scores
}
或者:
\hyphenation{
An-Obscenely-Long-Function-Name
Another\_Name\_With\_Under-scores
}
(嗯,这并不完全正确,如果我使用后者,我会在第 11 行遇到更多错误,但实际上对我来说是一样的,因为两者都无法工作。此外,如果我修改这catcode
两个变体,它们的行为将完全相同。)
我阅读了 TeX 书中的附录 H“连字符”,但我认为它没有讨论我的情况,因为自然语言不使用下划线。
在定义连字符例外(即围绕 )之前,我还尝试将下划线的 catcode 调整为 11,\hyphenation{}
灵感来自这个答案),但也失败了。
那么我该如何定义连字符例外带有下划线的单词/名称?
我希望避免“处理”这些单词/名称的每一个实例(就像在这个问答中一样),这就是我要将它们添加到连字符例外中的原因。
答案1
在 pdflatex 中,连字符取决于字符的 lccode。并且 catcode 最好不要是 8,因为\hyphenation
这样不合适。
您可以更改 catcode 和 lccode,然后连字符就可以正常工作。但请注意,您不能再在另一个命令的参数中使用您的命令。
\documentclass{article}
\usepackage[ngerman,english]{babel}
\usepackage{xparse}
\usepackage{microtype}
\usepackage[T1]{fontenc}
\DeclareRobustCommand\funcfamily
{\fontencoding{OT1}\fontfamily\ttdefault\selectfont}
\catcode`\_=12 \lccode`\_=`\_
\hyphenation{
An-Obscenely-Long-Function-Name
Another_Name_With_Under-scores
}
\catcode`\_=8
\NewDocumentCommand{\funcref}{}{%
\begingroup
\catcode`\_=12
\funcrefaux}
\NewDocumentCommand\funcrefaux{mo}{%
\endgroup
\funcfamily\hyphenchar\font=130
\hyperref[#1]{#1(\IfValueTF{#2}{#2}{})}}
\usepackage{hyperref}
\begin{document}
AnObscenelyLongFunctionName AnObscenelyLongFunctionName AnObscenelyLongFunctionName
AnObscenelyLongFunctionName AnObscenelyLongFunctionName
foo bar baz \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{AnObscenelyLongFunctionName} \funcref{Another_Name_With_Underscores} \funcref{Another_Name_With_Underscores}
\funcref{Another_Name_With_Underscores}
\end{document}