我有数据(从数据库生成,不是手动输入的),这些数据大部分适合固定宽度的表格单元格,但有时会溢出,因为有长单词没有连字符。
可以通过以下示例演示该问题:
\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 中的溢出由措施 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}
(请参阅历史记录以了解旧答案)