使用 csquotes 时 tabularx 内部环境的解决方法

使用 csquotes 时 tabularx 内部环境的解决方法

我需要一个以表格形式显示数据的环境。最右边列的数量应在编译时调整,第一列是动态宽度。出于这个原因,我使用\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}

正如标题所示,一种解决方法是用 替换tabularxtabular*但这样一来,第一列的宽度就会出现问题。我需要对右侧每个附加列的大小(所有列的大小都大致相同)、前两列以及文本/行的宽度进行一些计算。大致如下:

\newcommand{\fcwidth}{\linewidth - (
    \widthof{\secondColumnCaption} +
    \extracols * \widthof{\extraColAvgWidth})
}

到目前为止,我已经尝试过\the\numexpr...\relax和包\usepackage{calc},但收效甚微,我已经没有主意了。如果有帮助的话,对于我使用的最终实现pgfkeyspgffor允许对环境内的标题和其他内容进行键值自定义,但我对 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}

相关内容