![显示特定单词的连字选项](https://linux22.com/image/249621/%E6%98%BE%E7%A4%BA%E7%89%B9%E5%AE%9A%E5%8D%95%E8%AF%8D%E7%9A%84%E8%BF%9E%E5%AD%97%E9%80%89%E9%A1%B9.png)
当 TeX 生成 Overfull box 时,会在日志中放入类似这样的内容:
Overfull \hbox (15.47195pt too wide) in paragraph at lines 7--9
[]\OT1/cmr/m/n/10 I re-ally re-ally want to get dis-played the op-tions for
hy-phen-ation xxxxxxxxxxxxxx |
我想要一个宏\showhyphens
,它可以\showhyphens{hyphenation}
显示条目的连字选项,即hy-phen-ation
。这应该显示在文档(首选)或日志中。
(背景:我需要这个来提交一篇包含许多多部分单词和类似内容的论文$(2,3)$-representation
。我知道有办法修改-
以\discretionary
使单词可分解,但这会使代码极其难以阅读,而且我不允许将其作为宏定义。)
答案1
冰!你的愿望已经实现。
认真地说:\showhyphens
已经存在完全相同的名称。
答案2
好的,这是答案印刷连字符:
\documentclass[12pt,a4paper]{article}
\def\rehbox{{\unskip\unpenalty\setbox0\lastbox\ifhbox0 \rehbox
\hbox{\unhbox0} \else \leavevmode \fi}}
\newcommand\printhyphens[1]{%
\setbox0\vbox{{%
\pretolerance-1\hsize=0pt\hfuzz=\maxdimen
\noindent\hspace*{0pt}#1\par\rehbox}\par}%
\unvbox 0
}
\begin{document}
\printhyphens{If you cannot reconsider this proposal, you are
incompatible, my dearest friend.}
\end{document}
由于第一个版本受保存堆栈使用的限制,因此这里提供了一个不受限制的版本。但是,正如评论中所述,它是 O(n^3),因此对于大参数来说,它会很快变得效率低下,而不使用保存堆栈的全部意义在于能够使用大参数。因此,首先将输入拆分为单词或行,然后使用第一个版本的调用逐个处理它们,这确实更有意义\printhyphens
。
\documentclass[12pt,a4paper]{article}
\def\rehbox{\unskip\unpenalty\setbox2\lastbox\ifhbox2
\setbox0\hbox{\hbox{\unhbox2} \unhbox0}\expandafter\rehbox\fi}
\newcommand\printhyphens[1]{%
\setbox0\vbox{{\setbox0\hbox{}%
\pretolerance-1\hsize=0pt\hfuzz=\maxdimen
\noindent\hspace*{0pt}#1\par\rehbox\unhbox0}\par}%
\unvbox 0
}
\begin{document}
\printhyphens{If you cannot reconsider this proposal, you are
incompatible, my dearest friend.}
\end{document}
答案3
使用 LuaTeX 您有两个选择:\usepackage{lua-visual-debug}
提供大量信息,或者\usepackage{showhyphens}
仅标记所有可能的连字点。
看http://texdoc.net/texmf-dist/doc/lualatex/showhyphens/showhyphens-doc.pdf
答案4
因为我知道 OP (yo) 懂捷克语,所以我可以参考《TeXbook naruby》这本书(全文可在网上找到这里\showhyphenpar
)、下面的第 225 页和第 226 页。这里显示了宏。后面的段落\showhyphenpar
打印时所有单词都显示为连字符。
\def\showhyphenpar{\bgroup
\def\par{\setparams\endgraf\composelines}
\setbox0=\vbox\bgroup \noindent\hskip0pt\relax}
\def\setparams{\rightskip=0pt plus1fil
\linepenalty=1000 \pretolerance=-1 \hyphenpenalty=-10000}
\def\composelines{\setbox2=\hbox{}%
\loop \setbox0=\lastbox \unskip \unpenalty
\ifhbox0 % je už \vbox vyprázdněn?
\global\setbox2=\hbox{\unhbox0\unskip\unhbox2}
\repeat
\egroup % vyprázdněný \vbox ukončím
\exhyphenpenalty=10000 % \box2 vyšoupnu do vnějšího seznamu
\emergencystretch=4em \leavevmode\unhbox2 \endgraf\egroup}
这个宏的原理在TeXbook naruby中有描述。