如果无法正常连字,则可随时换行

如果无法正常连字,则可随时换行

我有数据(从数据库生成,不是手动输入的),这些数据大部分适合固定宽度的表格单元格,但有时会溢出,因为有长单词没有连字符。

可以通过以下示例演示该问题:

\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
\begin{tabular}{|p{1cm}|p{4cm}|}
1 & Cell where normal hyphenation is possible ÄÖÜ \\
2 & CellwherenormalhyphenationisnotpossiblebutshouldwrapinsteadofoverflowÄÖÜ
\end{tabular}
\end{document}

我的要求是:

  1. 文本永远不会溢出单元格(假设有某个最小宽度,以便至少能容纳少量字符)
  2. 实现 1. 的首要措施是正常连字
  3. 如果 2. 失败,则允许在任何字符处断开单词,因此请在溢出发生之前填充行并断开(忽略正常的连字符规则)

在示例中,单元格 1 中的溢出由措施 2(正常连字符)阻止。第二个单元格溢出。我希望通过措施 3 来处理这个单元格。

要想知道答案,请考虑:

  • seqsplit 包对我没有帮助
  • 在回答中提出的自定义宏 \wrapseqsplit-保留空格接近我的愿望,但无法处理非 ascii 字符 ÄÖÜ (无论它们是使用 utf8 输入编码输入还是使用 \"A\"O\"U 输入)
  • 由于文本来自数据库,因此不需要手动编辑单元格内容。

我的一个想法是\linebreak[0]在每个字符后插入一个字符,告诉 LaTeX 如果没有更好的机会,可以中断。但这并不像预期的那样有效。

感谢您的建议!

答案1

您可以进行试验设置,看看是否有任何大框,然后如果有,则循环逐个字符添加\penalty0并重新设置。

在此处输入图片描述

\documentclass{article}
\usepackage[utf8]{inputenc}
\makeatletter
\def\foo#1{%
\setbox0\vbox{%
\global\let\foonext\foohyph
\hbadness\maxdimen
\hfuzz\maxdimen
#1\par
  \loop
  \unskip\unpenalty\unskip\unpenalty
  \setbox\z@\lastbox
  \ifvoid\z@
  \else
   \setbox\z@\hbox{\unhbox\z@}%
   \ifdim\wd\z@>\dimexpr\hsize+4pt\relax% compensate for hfuzz and not checking for shrink
    \global\let\foonext\foowrap
   \fi
  \repeat}%
\foonext{#1}%
}
\def\foohyph#1{#1}
\def\foowrap#1{\foowrap@#1\foowrap@}

\def\foowrap@{\futurelet\tmp\foowrap@@}

\def\foowrap@@{%
\let\next\relax
\ifx\tmp\foowrap@
\let\foowrap@\relax
\else\ifx\tmp\lbrace
\else\ifx\tmp\@sptoken
\let\next\foowrap@sp
\else\ifcat\noexpand\tmp\active% only active character utf8 chars
\let\next\foowrap@aa
\else
\let\next\foowrap@a
\fi\fi\fi\fi
\next
}

\def\foowrap@sp{\afterassignment\foowrap@\let\tmp= }

\def\foowrap@a#1{%
\leavevmode\penalty\z@#1\foowrap@}

\def\foowrap@aa#1#2{%
\leavevmode\penalty\z@#1#2%
\foowrap@}
\makeatother

\begin{document}
\begin{tabular}{|p{1cm}|p{4cm}|}
1 & \foo{Cell where normal hyphenation is possible ÄÖÜ}\\
2 & \foo{CellwherenormalhyphenationisnotpossiblebutshouldwrapinsteadofoverflowÄÖÜ}
\end{tabular}




\end{document}

答案2

您可以使用\text_map_inline:nn尊重 Unicode 字符。

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

\newcommand{\breakandspace}{%
  \nobreak
  \hspace{0pt plus 1fil}% add a filling space
  \allowbreak
  \hspace{0pt plus -1fil}% remove the filling space
}

\ExplSyntaxOn
\NewDocumentCommand{\longcell}{m}
 {
  \text_map_inline:nn { #1 } { ##1\breakandspace }
  \unskip\unpenalty\unskip\unpenalty
 }
\ExplSyntaxOff

\begin{document}
\begin{tabular}{|p{1cm}|p{4cm}|}
1 & Cell where normal hyphenation is possible ÄÖÜ \\
2 & \longcell{CellwherenormalhyphenationísnotpossiblébutshöuldwrapinsteadofoverflowÄÖÜ}
\end{tabular}
\end{document}

在此处输入图片描述

(请参阅历史记录以了解旧答案)

相关内容