我面临的情况是,我有点面临表格的模块化和条件组装,这会阻止 \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}
尽管你可能需要有条件地执行\\
是否确实存在任何注释(这取决于如何定义)
这其中的任何部分都与源文件中的换行符无关。