\arraybackslash
在答题表中使用了如何自动调整我最后一个表格的列宽,以及为什么这个表格上有 Underfull \vbox 问题?
\documentclass[10pt,a5paper,twoside]{memoir}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[brazil]{babel}
\usepackage{ragged2e}
\usepackage[showframe,pass]{geometry}
\usepackage{ltablex}
\keepXColumns
\begin{document}
\frenchspacing
\setlength\extrarowheight{2pt}
\begin{tabularx}{\linewidth}{|>{\RaggedRight}p{3cm}|>{\arraybackslash}X|}
\caption{Formatação do texto}
\label{tab:a_table_formatacao_de_texto} \\
\hline
\endfirsthead
\multicolumn{2}{c}{\tablename~\thetable: Formatação do texto (continued)} \\
\hline
\endhead
\hline
\multicolumn{2}{r}{\footnotesize to be continued}
\endfoot
\hline
\endlastfoot
Cor & Branco - \\ \hline
Formato do papel & A5 \\ \hline
Gramatura & 75 \\ \hline
Cabeçalho & 0,7 \\ \hline
Impressão & Frente e verso \\ \hline
Margens & Espelhadas: superior 2, Inferior: 1,5 \\ \hline
Cabeçalho & 0,7 \\ \hline
Rodapé & 0,7 \\ \hline
Paginação & Externa \\ \hline
Alinhamento vertical & Superior \\ \hline
Cabeçalho & 0,7 \\ \hline
Alinhamento do texto & Justificado \\ \hline
Cor & Branco - \\ \hline
Formato do papel & A5 \\ \hline
Cabeçalho & 0,7 \\ \hline
Gramatura & 75 \\ \hline
Impressão & Frente e verso \\ \hline
Margens & Espelhadas: superior 2, Inferior: 1,5 \\ \hline
Rodapé & 0,7 \\ \hline
Paginação & Externa \\ \hline
Alinhamento vertical & Superior \\ \hline
Alinhamento do texto & Justificado \\ \hline
\end{tabularx}
\end{document}
关于这个问题\\ 和 \tabularnewline 之间的区别对此有一些解释:
\arraybackslash
:恢复\\
以用于阵列和表格环境(之后\raggedright
等)。\def\arraybackslash{\let\\\tabularnewline}
为什么会被这些等命令\\
破坏?\raggedright
读这一行\def\arraybackslash{\let\\\tabularnewline}
似乎\\
被重新定义为\tabularnewline
,\raggedright
这些等等其他命令是否将其重新定义为其他东西,为什么?
我是否只需要\arraybackslash
在表格的最后一列上放置它?如果我不放置它或者只在中间一列上放置它或者在每一列上放置它会发生什么?
答案1
与 TeX 中的几乎所有内容一样,控制序列(宏和控制字)可以重新定义,并且由于本地分组允许本地重新定义,因此特定环境中的宏定义可能与该环境之外的定义不同。这就是 的情况\\
,它根据环境有多个定义。
在普通文本中,\\
定义为:
\let \reserved@e \relax \let \reserved@f \relax \@ifstar
{\let \reserved@e \vadjust \let \reserved@f \nobreak \@xnewline }
\@xnewline
在表格环境中,它定义为:
\@tabularcr
扩展为:
{\ifnum 0=`}\fi \@ifstar \@xtabularcr \@xtabularcr
在raggedright
环境中,\\
被重新定义为
\@centercr
扩展为:
\ifhmode \unskip \else \@nolnerr \fi \par \@ifstar {\nobreak \@xcentercr }\@xcentercr
由于这些定义不同,在使用了\raggedright
环境之后,tabular
您需要使用\arraybackslash
来将其恢复为其tabular
定义。
除了您链接的问题之外,另请参阅:
答案2
在这种情况下,可能需要更多解释。与大多数事情一样,通常您必须查看 LaTeX 的源代码才能弄清楚。
为什么首先要\centering
重新定义?\\
为了回答这个问题,我们需要:
- 起作用的主要原因
\centering
是它设置了\leftskip=0pt plus 1fil
和\rightskip
相同的值。(相关阅读;源代码) - 在普通文本中
\\
实现基本上是这样做\hfil\break
其中\break
基本上是\penalty-10000
。(源代码)。 - 基本上(从技术上来说)
\centering
\\
是这样的。(\par
\unskip\par\addvspace{-\parskip}
源代码)
我们只是尝试使用它的正常定义\hfil\break
并看看出了什么问题。
%! TEX program = lualatex
\documentclass{article}
\usepackage{lua-visual-debug}
\begin{document}
{
\centering
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit,
vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum
gravida mauris. Nam arcu libero, nonummy eget,\hfil\break consectetuer id,
vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant
morbi tristique senectus et netus et malesuada fames ac turpis egestas.
Mauris ut leo. Cras viverra metus rhoncus sem. Nulla et lectus
vestibulum urna fringilla ultrices. Phasellus eu tellus sit amet tortor
gravida placerat. Integer sapien est, iaculis in, pretium \par quis, viverra
ac, nunc. Praesent eget sem vel leo ultrices bibendum. Aenean faucibus.
Morbi dolor nulla, malesuada eu, pulvinar at, mollis ac, nulla.
Curabitur auctor semper nulla. Donec varius orci eget risus. Duis nibh
mi, congue eu, accumsan eleifend, sagittis quis, diam. Duis eget orci
}
\end{document}
输出:
前一行右侧\hfil\break
有空格两次左边空间的总数,因为左边跳过的总数为\leftskip=0pt plus 1fil
,右边跳过的总数为加上\rightskip=0pt plus 1fil
,所以。1fil
\hfil
0pt plus 2fil
可能会已经最好在重新定义之前\centering
检查它是否在里面,但由于历史原因,现在可能不会改变。tabular
\\
另注释\centering
等没有重新定义(这和普通文本中\newline
无星号的作用是一样的),所以在居中环境中会出现上述问题。\\
\newline
如何创建带有文本“raggedright/centered/raggedleft”的固定宽度表格列?