连字符连字符:如何更改默认的 \discretionary

连字符连字符:如何更改默认的 \discretionary

我的语言葡萄牙语又经历了一次正字法改革(那些委员会根本无法避免时不时地制造这种混乱。)现在我们必须适应,这就带来了我的问题。

根据新规则,当换行符出现在一个单词的文字连字符处时,它应该加倍,出现在第一行的末尾在第二个的开头。

像“Terão que adaptar-se ou perecer!”这样的短语,在连字符处断开,应该是这样的:

您需要适配器
或驱动程序!

在 TeX 术语中,每个文字连字符应替换为

\discretionary{-}{-}{-}

或随后

\discretionary{}{-}{}

但是 TeX 的(显然)硬编码的文字连字符自由裁量符\discretionary{}{}{}(称为“空自由裁量符”)插入在每个“-”之后 [The TeXBook,第 95 页]。

显而易见的解决方案

\chardef\hyphen=`\-
\catcode`\-=13
\def-{\penalty\exhyphenpenalty
\discretionary{\hyphen}{\hyphen}{\hyphen}}

几乎不可用,因为你不能重新定义像“-”这样的字符,TeX 作业中大量使用这个字符,而不会带来太多麻烦。

有没有正确的方法来实现这种效果?还是只能深入研究 TeX 的源代码或等待 LuaTeX?

答案1

一种不需要 LuaTeX 的方法是采用与德语中处理连字符的方式类似的方法。例如

\documentclass{article}
\catcode`\"=\active
\def"#1{\ifx#1-\discretionary{-}{-}{-}\fi}
\begin{document}
Some filler text. 
Some filler text.
Some filler text.
Some filler text.
Some"-hyphenated word.
\end{document}

当然,这需要使用一个额外的字符,这可能不是理想的选择。另一方面,我不认为 TeX 引擎中有一个钩子可以改变事物,所以我猜唯一“不改变输入”的改变事物的方法就是使用 LuaTeX。

答案2

更多优雅的方法是使用巴别塔命令速记 \babelhyphen{repeat}(第 1.5 节)定义一个新字符(或在本例中为两个)作为可重复的连字符。它是专门为此设计的(请参阅这个问题):

hard hyphen inside compound words are repeated at the beginning of the next line.

像这样:

    \documentclass{article}
    \textwidth=5cm % just making easier to spot with less text
    \usepackage[brazil]{babel}
    \defineshorthand{"-}{\babelhyphen{repeat}} % generates a hyphen that will repeat on a new line
    \begin{document}
Text Text Text Text sabendo-se % without repeated hyphen

Text sabendo-se                % won't repeat anyway    

Text Text Text Text sabendo"-se % with repeated hyphen

Text sabendo"-se                % won't repeat anyway
    \end{document}

显示重复连字符的屏幕截图

是的,它仍然会使代码看起来很奇怪并且要求作者每次都输入一个额外的字符,但它有效并且很简单。

答案3

我通常使用的替代方法是重新定义下划线以提供这种断开时重复的连字符:

\let\oldunderscode=_
\catcode`\_\active
\def_{\ifmmode\oldunderscore\else\discretionary{-}{-}{-}\fi}

这保留了数学模式中的含义_,这很重要!!另外,请注意不要在标签中使用 _,因为它们不起作用。我通常都会写\label{my-section},所以这对我来说不是问题。

现在,您只需要写Terão que adaptar_se ou perecer!,我认为它仍然非常易读,并且还具有使用单个字符的优势。

我通常将类似的代码放在一个单独的 .sty 文件中,需要时再导入。此包可帮助我在以英语为主要语言的文档中编写少量葡萄牙语文本,这会更改连字规则(前提是 babel 加载了葡萄牙语),还会发出\frenchspacing禁用句子末尾“双空格”的功能,这是英语排版中的传统做法,但葡萄牙语中却不是。

相关内容