我需要一个以表格形式显示数据的环境。最右边列的数量应在编译时调整,第一列是动态宽度。出于这个原因,我使用\usepackage{tabularx}
。但是,当我将其添加\usepackage{csquotes}
到包列表中时,我收到以下错误:
Misplaced \noalign. (in macro \hline)
为了说明这个问题,请考虑下面的 MWE:
\documentclass{article}
\usepackage{latexsym} % for \Box
\usepackage{tabularx}
\usepackage{multicol} % for headings
% \usepackage{csquotes} % Uncomment and won't work anymore
\newcommand{\extracols}{5}
\newenvironment{mydyntable}{%
\newcommand{\extraheadings}[1]{% Autogenerated
$1^{st}$&$2^{nd}$&$3^{rd}$&$4^{th}$&$5^{th}$%
}
\newcommand{\myheading}[1]{%
\xdef\colspan{\the\numexpr2+\extracols\relax}%
\phantom{.} \\[-2em]\multicolumn{\colspan}{X}{\textbf{##1}}\\
}
\newcommand{\myrecord}[2]{% Also autogenerated
##1&##2&$\Box$&$\Box$&$\Box$&$\Box$&$\Box$\\
}
\tabularx{\textwidth}{ X r *{\extracols}{c}}
\textbf{First} & \textbf{Second} & \extraheadings{\extracols}
\\\hline
}{% \end{mydyntable}
\hline\\ %Breaks here!!!!!
\endtabularx
}
\begin{document}
\begin{mydyntable}
\myheading{Fuuu}
\myrecord{Hello}{World}
\end{mydyntable}
\end{document}
简单的解决方案是记录该解决方案与 csquotes 不兼容,但由于原因两者可能(并且将会)一起使用。此外,解决方案很可能将作为包导出,因此我还想将对外部包的依赖降至最低。我检查过的解决方案包括[1],[2],[3], 和[4]。
已经尝试过 environNewEnviron
但没有成功。 也得到了不好的结果\usepackage{tabu}
。
正如标题所示,一种解决方法是用 替换tabularx
,tabular*
但这样一来,第一列的宽度就会出现问题。我需要对右侧每个附加列的大小(所有列的大小都大致相同)、前两列以及文本/行的宽度进行一些计算。大致如下:
\newcommand{\fcwidth}{\linewidth - (
\widthof{\secondColumnCaption} +
\extracols * \widthof{\extraColAvgWidth})
}
到目前为止,我已经尝试过\the\numexpr...\relax
和包\usepackage{calc}
,但收效甚微,我已经没有主意了。如果有帮助的话,对于我使用的最终实现pgfkeys
,pgffor
允许对环境内的标题和其他内容进行键值自定义,但我对 tiks/pgf 的经验几乎为零。
为了摆脱错误,我知道我可以使用\tabularnewline
但我不知道如何解决\hline
问题以及这些黑客是否不会导致进一步的不兼容。
任何建议都值得赞赏。
编辑1:
正如 @moewe 在评论中指出的那样,错误也发生在etoolbox
以下 MWE 更加简单,但仍然重现了该问题
\documentclass{article}
\usepackage{etoolbox}
\usepackage{tabularx}
\newenvironment{mydyntable}
{\tabularx{\textwidth}{c}}
{\\\hline\endtabularx}
\begin{document}
\begin{mydyntable}
\end{mydyntable}
\end{document}
答案1
它与 一起工作environ
。
我做了一些调整以避免出现实际上不起作用的负间距,至少在示例中是这样。我保留了上标序数,即使我认为它们很丑陋。
\documentclass{article}
\usepackage{latexsym} % for \Box
\usepackage{tabularx}
\usepackage{multicol} % for headings
\usepackage{csquotes} % Uncomment and won't work anymore
\usepackage{environ}
\newcommand{\extracols}{5}
\newcommand{\colspan}{\the\numexpr2+\extracols\relax}
\NewEnviron{mydyntable}{%
\newcommand{\extraheadings}[1]{% Autogenerated
1\textsuperscript{st}&
2\textsuperscript{nd}&
3\textsuperscript{rd}&
4\textsuperscript{th}&
5\textsuperscript{th}%
}%
\newcommand{\myheading}[1]{%
\multicolumn{\colspan}{X}{\textbf{##1}}\\
}%
\newcommand{\myrecord}[2]{% Also autogenerated
##1&##2&$\Box$&$\Box$&$\Box$&$\Box$&$\Box$\\
}%
\begin{tabularx}{\textwidth}{ X r *{\extracols}{c}}
\textbf{First} & \textbf{Second} & \extraheadings{\extracols}
\\\hline
\BODY
\hline\\
\end{tabularx}
}
\begin{document}
\noindent
\begin{mydyntable}
\myheading{Fuuu}
\myrecord{Hello}{World}
\end{mydyntable}
\end{document}
如果单元格中没有段落,您可以执行相同的操作tabular*
:
\documentclass{article}
\usepackage{latexsym} % for \Box
\usepackage{csquotes}
\newcommand{\extracols}{5}
\newcommand{\colspan}{\numexpr2+\extracols\relax}
\newenvironment{mydyntable}{%
\newcommand{\extraheadings}[1]{% Autogenerated
1\textsuperscript{st}&
2\textsuperscript{nd}&
3\textsuperscript{rd}&
4\textsuperscript{th}&
5\textsuperscript{th}%
}%
\newcommand{\myheading}[1]{%
\multicolumn{\colspan}{l}{\textbf{##1}}\\
}%
\newcommand{\myrecord}[2]{% Also autogenerated
##1&##2&$\Box$&$\Box$&$\Box$&$\Box$&$\Box$\\
}%
\begin{tabular*}{\textwidth}{
l
@{\hspace{2\tabcolsep}\extracolsep{\fill}}
r
@{\hspace{2\tabcolsep}\extracolsep{0pt}}
*{\extracols}{c}
}
\textbf{First} & \textbf{Second} & \extraheadings{\extracols}
\\\hline}{%
\hline\\\end{tabular*}}
\begin{document}
\noindent
\begin{mydyntable}
\myheading{Fuuu}
\myrecord{Hello}{World}
\end{mydyntable}
\end{document}