更新
好吧。过了一会儿,我决定再次研究这个“问题”,结果发现在 pdfLaTeX 中,使用\usepackage[utf8]{inputenc}
和( unicode —
—,不是连字符---
)效果很好(至少我尝试过)。小修改:正如 @cfr 在她的回答中提到的那样(我忘了),如果你使用 T1 编码和,实际上可以使用---
(连字符)\hyphenchar\font=\string"7F
。在这两种方法中(无论我使用破折号—
还是---
)微型完美运行。
现在,问题仍然在 XeLaTeX 中。我想澄清一下我的想法:我希望破折号能够正确运行;无论我必须输入—
(unicode 破折号 —)还是---
(通常的 LaTeX 方式);它应该(除其他外)正确地将单词连字符连接起来;始终与单词连在一起;如果它后面跟着逗号/句号,它们应该连在一起;并且,微型应该可以工作,例如连字符应该仍然悬挂在边缘。
当然,有一个基本的解决方案(适用于任何引擎):例如,向 XeLaTeX 指示断点ocur\-recone\-stedoc\-umento---
。但我正在寻找一种自动解决方案。
如果您有什么想说的,请说吧,我们欢迎!
注意:—
代码中看到的每个都是破折号。
我正在写一篇论文,而 XeLaTeX 不会对以 结尾的单词进行连字符处理–
(传统 LaTeX ---
)。阅读评论后,我意识到这也是 LaTeX 中的一个常见问题(不仅仅是 XeLaTeX)。这是一个最小的工作示例:
此代码(问题底部的完整示例)输出
—Hola, esto es un texto absurdo —para ejemplificar lo que ocurreconestedocumento— con algunas palabras más.
—
例如,如果我们用逗号代替最后一个,它就可以正确地连字符
—Hola, esto es un texto absurdo —para ejemplificar lo que ocurreconestedocumento, con algunas palabras más.
此外,如果短语以—.
XeLaTeX 结尾(或任何这样做的人),则句号会移到下一行
—Hola, esto es un texto absurdo —para ejemplificar lo que ocurreconestedocumento—.
这是一个完整的最小工作示例
\documentclass{scrartcl}
\usepackage[hmargin = 4cm]{geometry}
\usepackage{fontspec}
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
—Hola, esto es un texto absurdo —para ejemplificar lo que ocurreconestedocumento— con algunas palabras más.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{document}
有任何想法吗?
答案1
您可以准备以下示例:
\input ucode
\input lmfonts
\hsize=12cm
—Hola, esto es un texto absurdo —para ejemplificar lo que
ocurreconestedocumento— con algunas palabras más.
\end
你可以尝试用 1)xetex test
和 2)来处理它xetex -fmt pdfcsplain test
。你会看到不同的结果:1) 长单词没有连字符,2) 长单词有连字符。
您可以研究代码设置、连字符设置等方面的差异。在我看来,LuaLaTeX 复制了 xetex 的 eplain 中的设置,而不是 pdfcsplain 中的设置。所以,您遇到了问题。
编辑:区别在哪里?我们可以在xetex.ini
和中看到以下设置xelatex.ini
:
\XeTeXdashbreakstate=1
答对了!这就是问题所在。设置后\XeTeXdashbreakstate=0
,您的单词将被连字符连接。
答案2
你可以阅读条目关于我的(现已废弃的)博客中的这个问题,它发生的原因,以及在西班牙 babel 中如何解决这个问题。
但是你使用的是 xelatex 和 polyglossia,我不知道这个页面是否已经包含了某些解决方案。无论如何,很容易适应 babel 使用的思想和技术,并定义以下命令:
\def\raya{%
\nobreak\hskip0pt\hbox{---}\nobreak\hskip0pt%
}
您必须放入\raya{}
而不是---
。因此,在您的示例中:
\raya{}Hola, esto es un texto absurdo \raya{}para ejemplificar lo que ocurreconestedocumento\raya{} con algunas palabras m
ás.
\raya{}Hola, esto es un texto absurdo \raya{}para ejemplificar lo que ocurreconestedocumento\raya{}, con algunas palabras
más.
\raya{}Hola, esto es un texto absurdo \raya{}para ejemplificar lo que ocurreconestedocumento\raya{}.
输出结果如下:
更新
根据OP的要求,可以使unicode字符-活动(这在xelatex中很容易,因为它具有本机的utf8输入),定义—
为新的Unicode字符,然后使用—
它而不是\raya
[感谢egreg指向我包newunicodechar
,这比我之前尝试更改catcodes更干净的解决方案,并且不存在字符后空格的问题]:
\documentclass{scrartcl}
\usepackage[hmargin = 4cm]{geometry}
\usepackage{fontspec}
\usepackage{newunicodechar}
\newunicodechar—{%
\leavevmode\nobreak\hskip0pt\hbox{---}\nobreak\hskip0pt\relax%
}
\begin{document}
—Hola, esto es un texto absurdo —para ejemplificar lo que ocurreconestedocumento— con algunas palabras más.
—Hola, esto es un texto absurdo —para ejemplificar lo que ocurreconestedocumento—, con algunas palabras más.
—Hola, esto es un texto absurdo —para ejemplificar lo que ocurreconestedocumento—.
\end{document}
导致:
答案3
在采用 T1 编码的常规 TeX 中,有一种方法可以避免此问题,即重新定义连字符。这是可能的,因为 T1 编码的两个连字符看起来相同(在大多数字体中),但作用不同。
它的美妙之处在于它不需要像 Babel 解决方案那样使用任何特殊命令。你只需在 \begin{document} 后面添加一行代码:
\hyphenchar\font=\string"7F
在使用 fontenc 包加载 T1 后。这会告诉 TeX 使用字符槽 127 作为连字符。也就是说,当 TeX 需要跨行拆分单词时,它将使用 "7F 来连字符。但是,它不会改变您输入 '-' 时获得的字符。该字符对应于 T1 编码的 45 号槽中的字符。因此 TeX 看不到已经连字符的单词作为连字符。因此,禁止对已连字符的单词进行连字符连接的规定不再适用,TeX 会根据需要断开单词。这也保留了连字符,因为 T1 中的连字符(例如“--”和“---”)中定义的是位置 45 中的字符(而不是位置 127 中的字符)。因此,您可以毫无顾忌地破坏英语排版规范!
所以我想知道 XeLaTeX 是否也能实现类似的功能。fontspec 的文档解释了如何重新定义连字符。事实证明,这似乎与 LaTeX 技巧类似。也就是说,它允许在本身带有连字符的单词中使用连字符(从 TeX 的角度来看,在本例中就在末尾)。我不确定如何正确指定替代连字符,但感谢 Khaled Hosny 的评论,我认为应该如下:
\documentclass{scrartcl}
\usepackage[hmargin = 5cm]{geometry}
\usepackage{fontspec}
\begin{document}
\fontspec[Mapping=tex-text]{Latin Modern Roman}%
\addfontfeature{HyphenChar="2010}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
---Hola, esto es un texto absurdo ---para ejemplificar lo que ocurreconestedocumento--- con algunas palabras más.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{document}
输出如下:
这不是 Latin Modern 所特有的。只是我不知道如何为所有字体添加通用字体功能。fontspec 似乎希望我指定一种字体来添加该功能。它应该适用于任何包含 U+2010 的字体。例如:
\documentclass{scrartcl}
\usepackage[hmargin = 5cm]{geometry}
\usepackage{fontspec}
\begin{document}
\fontspec[Mapping=tex-text]{Brill Roman}%
\addfontfeature{HyphenChar="2010}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
---Hola, esto es un texto absurdo ---para ejemplificar lo que ocurreconestedocumento--- con algunas palabras más.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{document}
生成:
此解决方案不像 LaTeX 解决方案那样通用。LaTeX 解决方案可以用于任何字体中包含任何连字符,因为在设置字体以供 LaTeX 使用时,可以使用单个连字符两次。也就是说,如果字体本身没有第二个连字符,您可以在插槽 127 中重复连字符。从 TeX 的角度来看,插槽 45 和 127 中的字符实际上是那么不同。
相反,我给出的解决方案要求字体实际上在合适的位置有第二个连字符。(而 U+00AD 中的软连字符似乎不起作用。)尽管如此,它应该适用于许多字体,尤其是那些更可能与 TeX 一起使用来排版正文的字体,而不是仅仅用于覆盖范围非常有限的字体的花哨标题。但对于花哨的标题来说,连字符不太可能成为问题。
如果有一个完美的通用解决方案就好了,但我不确定如果不重新设计 TeX 本身的核心,是否能实现这一点,因为据我所知,禁止断开已连字符的单词是硬编码的,无法在宏级别更改。也就是说,您必须重写 TeX 连字符算法的相关部分才能更改这一点。
编辑:如果您想直接输入 emdash 而不是输入 ---,以下内容将 egreg 在对 JLDiaz 的答案的评论中的建议与此处建议的连字符规范结合起来:
\documentclass{scrartcl}
\usepackage[hmargin = 4cm]{geometry}
\usepackage{fontspec}
\usepackage{newunicodechar}
\newunicodechar—{{---}}
\begin{document}
\fontspec[Mapping=tex-text]{Latin Modern Roman}%
\addfontfeature{HyphenChar="2010}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
—Hola, esto es un texto absurdo —para ejemplificar lo que ocurreconestedocumento— con algunas palabras más.
—Hola, esto es un texto absurdo —para ejemplificar lo que ocurreconestedocumento—, con algunas palabras más.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{document}
输出:
这还允许使用连字符,例如,在破折号后面直接跟一个逗号,以及在破折号后面直接跟一个空格进行换行。
答案4
当然,这不是一个通用的解决方案,它遵循了其他一些建议的精神,但对空格宽度进行补偿可以实现正确的连字。该值取决于字体。
\documentclass{scrartcl}
\usepackage[hmargin = 4cm]{geometry}
\usepackage{fontspec}
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
---Hola, esto es un texto absurdo ---para ejemplificar lo que ocurreconestedocumento \hspace{-0.33em}--- con algunas palabras más.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{document}