如何强制 LaTeX 不在连字符“-”后断行?

如何强制 LaTeX 不在连字符“-”后断行?

我们~可以强制两个单词之间不出现换行符。

但这似乎不适用于特殊字符。我希望 LaTeX 强制不要在-in之后换行(re-)creation

(re-在我的文档中,和之间有换行符)creation,看起来有点难看。

我怎样才能实现这个目标?

答案1

如果你把它放在 中mbox,它就不会被分解:

\mbox{(re-)creation}

但这意味着它不能在单词的任何地方被分解!

答案2

不要重新发明轮子——有一个包可以解决这个问题

它被称为extdash包,并用破折号添加了多个用于新行为的命令。

重要的:将此包作为最后一个包加载(甚至在之后hyperref

如果您想使用而不是 ,请添加shortcuts选项:。更多详情请访问\usepackage[shortcuts]{extdash}\-/\Hyphdashhttps://www.ctan.org/pkg/extdash

然后,您可以使用新的破折号来控制带有破折号的单词的断开行为。

标准 LaTeX 破折号

  • -标准 LaTeX 连字符
  • --标准 LaTeX 破折号
  • ---标准 LaTeX 破折号

extdash可破坏的破折号

用这些破折号连字符连接的单词也可以在破折号以外的其他位置断开

  • \-/连字符
  • \--短划线
  • \---破折号

extdash牢不可破的破折号

连字符处不能换行

  • \=/连字符
  • \==短划线
  • \===破折号

对于像$x$\=/axis$x$\=/$y$\=/plane或您的问题的表达很有用;)

答案3

amsmath包提供了\nobreakdash插入命令相关破折号:

示例输出

\documentclass{article}

\usepackage{amsmath}

\usepackage[width=1.5cm]{geometry}

\begin{document}

A (re\nobreakdash-)creation.

A (re-)creation.

\end{document}

答案4

总结

\newunicodechar{‑}{{\fontencoding{T1}\selectfont\symbol{'177}}\nolinebreak\hspace{0pt}}

然后,只需在右括号前使用 ‑ (U+2011) 代替 - (U+002D)。这意味着您现在可以写(re‑)creation(Web‑)Frameworks甚至Entwicklungs‑, Test/QS‑, Staging‑ oder Produktivsystem(是的,我让破折号逗号正常工作了)。

如果这对你不起作用,@dessert 报告说,这个和德米特里的回答作品:

\newunicodechar{‑}{\babelhyphen{nobreak}}

使用哪一个似乎取决于您使用的版本babel以及如何使用它。

背景故事

我也在寻找这个,但作为一个更通用的解决方案,到目前为止,我找到的答案都不能让我满意。我确实有德语 Babel 包,但"~只是为我排版了一个双引号,后跟一个空格(事实上,我认为我更喜欢将双引号呈现为引号字符)。

我查看了 Unicode,发现 ‑U+2011 NON-BREAKING HYPHEN似乎是我想要的。显然,Xe(La)TeX 已经支持此功能,但我们使用 pdflatex(在一个项目中直接使用,在另一个项目中通过 maven-latex-plugin 使用),因此无法使用。

但这为我指明了正确的方向:我已经知道\newunicodechar所以我想我可以让 U+2011 可用。我的第一次尝试是……

% does not work
\newunicodechar{‑}{-}

… 只是将其定义为连字符,但这样不行。所以,在阅读了这里的一些答案后,我尝试了…

% throws an error message
\newunicodechar{‑}{\nobreakdash-\hspace{0pt}}

…但\nobreakdash显然还不知道。最后,我尝试了…

% works for me, except commas
\newunicodechar{‑}{-\nolinebreak\hspace{0pt}}

…然后,我就可以排版“(Maschinen‑)Benutzernamen”了,没有难看的分隔线自动连字符将其变成“(Maschinen-)Benut-⏎zernamen”,这真是太完美了。更棒的是,从 PDF 复制/粘贴时,您会得到一个实际的 - ,这使得获取(用于 XML 注释)U+002D HYPHEN-MINUS之类的操作可以正常工作。\texttt{<!‑‑}<!--

更新 2016-09-04:逗号

但有一个问题:‑,仍然会把多余的逗号推到下一行。解释与我们在宏扩展中仍然使用 ASCII 连字符减号有关-,Teχ(无用)为其添加了一个自由裁量断点。但是,如果当前字体具有 T1 编码(而不仅仅是 OT1 或 LY1),则可以解决这个问题,方法是暂时切换到当前字体的 T1 编码变体并输出命名字符 127(0x7F),这与标准 \hyphenchar 45(0x2D)完全相同。

% works for me
\newunicodechar{‑}{{\fontencoding{T1}\selectfont\symbol{'177}}\nolinebreak\hspace{0pt}}

对于我使用的(自定义 TrueType)字体,这需要一些黑客行为由于ttf2tfm 错误;如果您只是想确保字体的 T1 编码在正确的位置具有正确的字形,请使用以下命令(并替换museo为您的字体名称):

\documentclass{article}
\usepackage{fonttable}
\usepackage[T1]{fontenc}

\begin{document}
\thispagestyle{empty}
\pagestyle{empty}
\xfonttable{T1}{museo}{m}{n}
\end{document}

(注:我把我对几个问题的回答合并在这个答案然后将其复制到这些其他问题中,所以不要奇怪它是否出现在三个地方。)

相关内容