显示特定单词的连字选项

显示特定单词的连字选项

当 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中有描述。

相关内容