表格中有很多文字。我想用 2cm 的宽度换行。最后一列有 [1][2][3].....[89][100],但列宽只有 2 cm。它应该自己换行。
我怎样才能实现它?
答案1
我认为括号可能应该处于数学模式,这样就可以使用数学代码“8000 为右括号插入活动定义。
\documentclass{article}
\usepackage{array}
\edef\savedbrack{\mathchar\the\mathcode`\] }
\begingroup
\uccode`\~`\]
\uppercase{\endgroup
\def\breakablebracket{%
\mathcode`\]"8000
\def~{\savedbrack\penalty 50 }}}
\begin{document}
\begin{tabular}{|>{\raggedright\arraybackslash\breakablebracket$}p{2.0cm}<{$}|}
[1][7][3][8][5][9][7][8][9][89][100]
\end{tabular}
\end{document}
答案2
在这种情况下,使用p{2.0cm}
列类型是必要的,但还不够,因为没有自然断点。这与表格无关,即使在普通文本中,使用没有自然断点的内容也是如此[1][1][3][2][5][3][7][8][9][89][100]
。
因此,仅使用p{2.0cm}
列:
\begin{tabular}{p{2.0cm}}
[1][7][3][8][5][9][7][8][9][89][100]
\end{tabular}
生成:
手动解决方案:
以下是将内容传递给 ``\AddBreakableChars{} macro, which allows for a discretionary line breaks following a
]` 的解决方案。因此:
\begin{tabular}{p{2.0cm}}
\AddBreakableChars{[1][7][3][8][5][9][7][8][9][89][100]}
\end{tabular}
我们得到了期望的结果:
参考:
- 改编自长行文本的自动换行?
自动化解决方案:
\usepackage{collcell}
如果在序言中包含了,那么您可以定义一个新的列类型,\AddBreakableChars
通过以下方式自动将此列中的每个条目传递到宏:
\newcolumntype{P}[1]{>{\collectcell\AddBreakableChars}p{#1}<{\endcollectcell}}
并使用P{<width>}
如下列类型:
\begin{tabular}{P{2.0cm}}
[1][10][3][11][5][12][7][8][9][89][100]
\end{tabular}
从而得到如上所示的预期结果。
代码:
\documentclass{article}
\usepackage{hyphenat}
\usepackage{xstring}
\usepackage{forloop}
\usepackage{collcell}
\newsavebox\MyBreakChar%
\sbox\MyBreakChar{}% char to display the break after non char
\newsavebox\MySpaceBreakChar%
\sbox\MySpaceBreakChar{-}% char to display the break after space
\makeatletter%
\newcommand*{\BreakableChar}[1][\MyBreakChar]{%
\leavevmode%
\prw@zbreak%
\discretionary{\usebox#1}{}{}%
\prw@zbreak%
}%
\newcounter{index}%
\newcommand{\AddBreakableChars}[1]{%
\StrLen{#1 }[\stringLength]%
\forloop[1]{index}{1}{\value{index}<\stringLength}{%
\StrChar{#1}{\value{index}}[\currentLetter]%
\IfStrEq{\currentLetter}{]}
{\currentLetter\BreakableChar[\MyBreakChar]}%
{\currentLetter}%
}%
}%
\newcolumntype{P}[1]{>{\collectcell\AddBreakableChars}p{#1}<{\endcollectcell}}
\begin{document}
\textbf{Manual Solution:}\par
\begin{tabular}{p{2.0cm}}
\AddBreakableChars{[1][7][3][8][5][9][7][8][9][89][100]}
\end{tabular}
\bigskip
\textbf{Automatic Solution:}\par
\begin{tabular}{P{2.0cm}}
[1][2][3][4][5][6][7][8][9][89][100]
\end{tabular}
\end{document}