etoolbox 和 tabularx —“appto”的问题

etoolbox 和 tabularx —“appto”的问题

我正在尝试打印工作表。我已经为子任务实现了自动编号。我将其用于tabularx我的子任务(请参阅下面的 MWE)。

昨天,我尝试定义一个名为 的新宏\task,它有一个可选参数,即您可以针对此特定问题获得的分数。我希望这些可选参数能够通过etoolbox\appto命令收集,以便我可以使用我的\credits命令打印它们。

到目前为止,这似乎有点困难,因为tabularx要多次处理表格。每次计算附加点的列tabularx的宽度都会导致点列表不正确。X\credits

有什么方法可以解决这个问题?我目前被这个问题困扰着。

另外,我不知道为什么我的\task命令有效。为什么计数器subtask不受tabularx多次试验的影响?

\documentclass{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{etoolbox}
\usepackage{booktabs}
\usepackage{ltablex}
\usepackage{xifthen}

\def\credits{}
\newcounter{subtask}
\setcounter{subtask}{1}
\renewcommand{\thesubtask}{\alph{subtask})}
\newcommand{\task}[1][]{%
    \ifthenelse{\isempty{#1}}{%
        \thesubtask%
        \stepcounter{subtask}%
    }{%
        \thesubtask%
        \gappto\credits{(#1)}%
        \stepcounter{subtask}%
    }%
}

\begin{document}
\begin{tabularx}{\linewidth}[l]{l@{\hspace*{1ex}}X}
    \task[1]    &   TEXT1\\
    \task       &   TEXT2\\
    \task[3]    &   TEXT3
\end{tabularx}
\credits
\end{document}

在此处输入图片描述


下面 David Carlisle 给出的解决方案导致表格太宽。如何解决此问题?

\documentclass{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage[a6paper, showframe=true]{geometry}

\usepackage{etoolbox}
\usepackage{booktabs}
\usepackage{ltablex}
\usepackage{xifthen}

\def\credits{}
\newcounter{subtask}
\setcounter{subtask}{1}
\renewcommand{\thesubtask}{\alph{subtask})}
\makeatletter
\newcommand{\task}[1][]{%
    \ifx\hfuzz\@tempdima%
%   % tabularx trial do nothing
    \else%
        \ifthenelse{\isempty{#1}}{%
            \thesubtask%
            \stepcounter{subtask}%
        }{%
            \thesubtask%
                \gappto\credits{(#1 BE)\\}%
            \stepcounter{subtask}%
        }%
    \fi
}
\makeatother


\begin{document}

\begin{tabularx}{\linewidth}[l]{l@{\hspace*{1ex}}X}
    \task[1]    &   Some longer text that exceedes the line width.\\
    \task[4]    &   TEXT2\\
    \task[3]    &   TEXT3
\end{tabularx}
\credits

\end{document}

在此处输入图片描述

答案1

首先回答您的最后一个问题。tabularx特别注意不要过度增加乳胶计数器,但默认情况下它不能处理在试验期间可能执行的其他类型的副作用。(LaTeX 维护一个全局结构,主要用于系统重置计数器值,\includeonly因此可以在省略部分后重置计数器,并tabularx“借用”该结构。

但是 tabularx 在试验期间会禁用其他功能,因此您可以测试试运行而不执行任何操作,在这里我测试\hfuzz仅在试验期间使用非标准定义:

\documentclass{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{etoolbox}
\usepackage{booktabs}
\usepackage{ltablex}
\usepackage{xifthen}

\def\credits{}
\newcounter{subtask}
\setcounter{subtask}{1}
\renewcommand{\thesubtask}{\alph{subtask})}
\makeatletter
\newcommand{\task}[1][]{%
    \ifx\hfuzz\@tempdima 
     \thesubtask
     \else
    \ifthenelse{\isempty{#1}}{%
        \thesubtask%
        \stepcounter{subtask}%
    }{%
        \thesubtask%
        \gappto\credits{(#1)}%
        \stepcounter{subtask}%
    }%
  \fi
}
\makeatother
\begin{document}
\begin{tabularx}{\linewidth}[l]{l@{\hspace*{1ex}}X}
    \task[1]    &   TEXT1\\
    \task       &   TEXT2\\
    \task[3]    &   TEXT3
\end{tabularx}
\credits
\end{document}

在此处输入图片描述

相关内容