我正在尝试将这个“时间轴”功能应用于我正在编写的文档。以下是我目前得到的代码:
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\addTimeline}[3][]{%
\ifcsname timeLine#2\endcsname
\expandafter\appto\csname timeLine#2\endcsname{ #3 #1\\}
\else
\expandafter\csdef{timeLine#2}{{\bf #2} #3 #1\\}
\fi
}
\newcommand{\gentimeLine}[2]{
\newcount\tmpc
\def\tabledata{}
\tmpc=#1
\loop \ifnum \tmpc<#2
\expandafter\csuse{timeLine\the\tmpc}
\advance \tmpc 1
\repeat
}
\begin{document}
\addTimeline{10}{Test1}
\addTimeline{20}{Test2}
\addTimeline{13}{Test3}
\addTimeline{25}{Test4}
\def\tabData{\gentimeLine{1}{26}}
\tabData
-
\begin{tabular}{c}\hline
\tabData
\end{tabular}
\end{document}
当然,\addTimeline
我打算在命令中使用#2 & #3 & #1
并{c c c}
在表格中使用,但出于测试目的,我将其保存在一列中。
预期输出为
10 Test1
13 Test3
20 Test2
25 Test4
后面是包含这些条目的表格,每个条目位于相应的行中。
但我得到的表格只有一行,包含第一个条目10 Test1
。不过,这 4 个项目以普通文本正确打印。
关于如何修复有什么建议吗?
答案1
您不能在一个表格单元格中开始循环并在另一个表格单元格中结束循环。因此,我使用\tabledata
一个容器,该容器已填满,然后一次性提供表格主体。
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\addTimeline}[3][]{%
\csappto{timeLine#2}{\unexpanded{\textbf{#2} #3 #1\\}}%
}
\newcount\tmpc
\newcommand{\gentimeLine}[2]{%
\def\tabledata{}%
\tmpc=#1\relax
\loop \ifnum \tmpc<#2
\edef\tabledata{\expandonce{\tabledata}\csuse{timeLine\the\tmpc}}%
\advance \tmpc 1
\repeat
\tabledata
}
\begin{document}
\addTimeline{10}{Test1}
\addTimeline{20}{Test2}
\addTimeline{13}{Test3}
\addTimeline{25}{Test4}
\def\tabData{\gentimeLine{1}{26}}
\begin{tabular}{c}\hline
\tabData
\end{tabular}
\end{document}
笔记
etoolbox
已经提供\csappto
将创建宏(如果不存在)\newcount
必须使用计数器超出宏的范围,否则每次调用时都会创建一个新的计数器定义
\unexpanded
中的\addTimeline
可能会对其他用途产生不利影响timeLine<number>
输出如下:
实现如下expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\addTimeline}{omm}
{
\tl_clear_new:c { l_benedict_timeline_#2_tl }
\tl_put_right:cn { l_benedict_timeline_#2_tl } { \textbf{#2}~#3 }
\IfValueT{#1}
{
\tl_put_right:cn { l_benedict_timeline_#2_tl } { ~#1 }
}
\tl_put_right:cn { l_benedict_timeline_#2_tl } { \\ }
}
\NewDocumentCommand{\genTimeline}{mm}
{
\tl_clear:N \l__benedict_timeline_body_tl
\int_step_inline:nnnn { #1 } { 1 } { #2 }
{
\tl_if_exist:cT { l_benedict_timeline_##1_tl }
{
\tl_put_right:Nv \l__benedict_timeline_body_tl { l_benedict_timeline_##1_tl }
}
}
\tl_use:N \l__benedict_timeline_body_tl
}
\tl_new:N \l__benedict_timeline_body_tl
\cs_generate_variant:Nn \tl_put_right:Nn { Nv }
\ExplSyntaxOff
\begin{document}
\addTimeline{10}{Test1}
\addTimeline{20}{Test2}
\addTimeline[again]{20}{Test2}
\addTimeline{13}{Test3}
\addTimeline{25}{Test4}
\begin{tabular}{c}
\hline
\genTimeline{1}{26}
\hline
\end{tabular}
\end{document}