![etoolbox 和 tabularx —“appto”的问题](https://linux22.com/image/402698/etoolbox%20%E5%92%8C%20tabularx%20%E2%80%94%E2%80%9Cappto%E2%80%9D%E7%9A%84%E9%97%AE%E9%A2%98.png)
我正在尝试打印工作表。我已经为子任务实现了自动编号。我将其用于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}