当没有空格可以换行时,如何在表格中换行?

当没有空格可以换行时,如何在表格中换行?

表格中有很多文字。我想用 2cm 的宽度换行。最后一列有 [1][2][3].....[89][100],但列宽只有 2 cm。它应该自己换行。

enter image description here

我怎样才能实现它?

答案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}

table with wrapped contents

答案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}

生成:

enter image description here


手动解决方案:

以下是将内容传递给 ``\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}

我们得到了期望的结果:

enter image description here

参考:


自动化解决方案:

\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}

相关内容