表格中的垂直线太长,而声明必须保持在不同的行上

表格中的垂直线太长,而声明必须保持在不同的行上

我面临的情况是,我有点面临表格的模块化和条件组装,这会阻止 \begin{} 和 \end{} 定义保留在相同的本地上下文中。是的,令人困惑(请参阅问题末尾的代码),但我认为这部分并不那么重要。它只是限制的性质,产生了其他地方描述的问题,即: 表格中的垂直线太长

这个问题提供了很好的屏幕截图来描述问题(即表格的垂直线延伸到最后一行),尽管我的表格看起来不太像它或接受的答案中产生的表格。

我的 MWE 在这里:

\documentclass{article}

\usepackage{xparse}


\usepackage{environ,longtable,threeparttablex,booktabs,multirow,array,adjustbox,supertabular}% table adjustment packages
% change spacing/padding of long table:  https://tex.stackexchange.com/questions/5683/how-to-remove-top-and-bottom-whitespace-of-longtable
\setlength{\LTpre}{0pt}
\setlength{\LTpost}{0pt}

% Wrapping text in multicolumn:  https://tex.stackexchange.com/questions/115668/wrapping-text-in-multicolumn
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
%https://tex.stackexchange.com/questions/70919/vertical-aligning-in-longtable-environment
%\adjustbox{valign=t}{}
%\raisebox{\normalbaselineskip-\height}{#6} & \multicolumn{2}{L{11cm}}{#7}
% changed m to p instead

\makeatletter
    \newcommand\eatpar{\@ifnextchar\par{\expandafter\eatpar\@gobble}\relax}
\makeatother

%--------------------New Commands for consistent formatting ---------------
\ExplSyntaxOn
% this one can't be a held in a local variable because the table paramaters are external
\DeclareDocumentCommand{\TableAssembly}{ m m }{%
    #1 & #2 \\%
}%

\NewDocumentCommand{\BuildTablePortion}{ O{R{2.5cm} | L{12.25cm}} m }%
{%
    \seaton_BuildTablePortion:nn { #1 }{ #2 }%
}%

\cs_new:Npn \seaton_BuildTablePortion:nn #1 #2 %
{%
    \str_case:nnF { #2 }{%
        {START}{%
            \begin{ThreePartTable}%
                \begin{TableNotes}[para,flushleft]%
                \end{TableNotes}%
                \renewcommand\multirowsetup{\raggedleft}%
                \begin{longtable}[l]{#1}%
                }%
                {END}{%
                    \eatpar%
                    %\\\insertTableNotes%
                    \let\\=\relax%
                \end{longtable}%
            \end{ThreePartTable}%
        }%
        % other possible strings
    }{ Failed to recognize instruction string #2}%
}%
\ExplSyntaxOff

\begin{document}
    \BuildTablePortion{START}
        \TableAssembly{1}{2}
        \TableAssembly{1}{3}
    \BuildTablePortion{END}
\end{document}

这里有一条针对这个答案的评论: https://tex.stackexchange.com/a/61879/69378为了正确解决这个问题,我希望了解更多相关知识。

如果在 \hline 之后和 \end{tabular} 之前有换行符,TeX 会假定您要向表中添加新行,但检测到没有数据后会结束表。只需删除换行符即可。

非常不言自明,但是因为我被提供的代码是使用宏来创建表、填充表和关闭表,所以我无法使用将所有声明放在同一行的解决方法。

IE

\hline \end{longtable} \end{ThreePartTable}%

代替

\hline%
\end{longtable}%
\end{ThreePartTable}%

我读了一些书,并尽我所能地思考,\let\\=\relax%或者像这样的新命令\newcommand\eatpar{\@ifnextchar\par{\expandafter\eatpar\@gobble}\relax}可能会有所帮助。

我尝试将它们放置在几乎每个与表格关闭块相关的排列中,甚至放置在表格填充命令中,所以我很确定有一些东西可以取代relax我不知道的这些命令的操作......

链接的问题/答案/评论已有几年了,表格环境真的(或仍然)对新行如此敏感吗?

答案1

您需要可扩展的主开关,因此我使用\DeclareExpandableDocumentCommand和移除了它们\let\\\relax,并且\eatpar(a) 不可扩展且 (b) 只能造成伤害。

这有效

\documentclass{article}

\usepackage{xparse}


\usepackage{environ,longtable,threeparttablex,booktabs,multirow,array,adjustbox,supertabular}% table adjustment packages
% change spacing/padding of long table:  http://tex.stackexchange.com/questions/5683/how-to-remove-top-and-bottom-whitespace-of-longtable
\setlength{\LTpre}{0pt}
\setlength{\LTpost}{0pt}

% Wrapping text in multicolumn:  http://tex.stackexchange.com/questions/115668/wrapping-text-in-multicolumn
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
%http://tex.stackexchange.com/questions/70919/vertical-aligning-in-longtable-environment
%\adjustbox{valign=t}{}
%\raisebox{\normalbaselineskip-\height}{#6} & \multicolumn{2}{L{11cm}}{#7}
% changed m to p instead

\makeatletter
    \newcommand\eatpar{\@ifnextchar\par{\expandafter\eatpar\@gobble}\relax}
\makeatother

%--------------------New Commands for consistent formatting ---------------
\ExplSyntaxOn
% this one can't be a held in a local variable because the table paramaters are external
\DeclareDocumentCommand{\TableAssembly}{ m m }{
    #1 & #2 \\
}

\DeclareExpandableDocumentCommand{\BuildTablePortion}{ O{R{2.5cm} | L{12.25cm}} m }
{
    \seaton_BuildTablePortion:nn { #1 }{ #2 }
}

\cs_new:Npn \seaton_BuildTablePortion:nn #1 #2 
{
    \str_case:nnF { #2 }{
        {START}{
            \begin{ThreePartTable}
                \begin{TableNotes}[para,flushleft]
                \end{TableNotes}
                \renewcommand\multirowsetup{\raggedleft}
                \begin{longtable}[l]{#1}
                }
                {END}{
                \insertTableNotes
                \end{longtable}
            \end{ThreePartTable}
        }
         other possible strings
    }{ Failed to recognize instruction string #2}
}
\ExplSyntaxOff

\begin{document}
    \BuildTablePortion{START}
        \TableAssembly{1}{2}
        \TableAssembly{1}{3}
    \BuildTablePortion{END}
\end{document}

尽管你可能需要有条件地执行\\是否确实存在任何注释(这取决于如何定义)

这其中的任何部分都与源文件中的换行符无关。

相关内容