\arraybackslash 对我的表格列执行什么操作?

\arraybackslash 对我的表格列执行什么操作?

\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\hfil0pt plus 2fil


可能会已经最好在重新定义之前\centering检查它是否在里面,但由于历史原因,现在可能不会改变。tabular\\

另注释\centering等没有重新定义(这和普通文本中\newline无星号的作用是一样的),所以在居中环境中会出现上述问题。\\\newline如何创建带有文本“raggedright/centered/raggedleft”的固定宽度表格列?

相关内容