带有下划线的连字符例外列表项?

带有下划线的连字符例外列表项?

作为这个问题,我想问一下:如何正确添加连字符例外包含下划线?

注意:之前的问题(我发现了一些)已经解决不知何故修复连字符,即使这意味着要破坏要连字符的每一个单词。但我需要一个解决方案,它不需要我在将文本交给 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}

相关内容