问题
我正在尝试获取基于多个分隔符字符串的表。我目前的想法是使用\setsepchar{}
和\readlist
。
我将我的要求和详细信息放入表格中,因为我很难将信息以一种合理的方式转换成句子。
标准
回答要求
# | 要求 | 原因 |
---|---|---|
1 | 可选添加前缀到左列 | 所有行的左列前缀相同 |
2 | 可选择在右列添加后缀 | 所有行的右列后缀相同 |
3 | 可从表格环境调用的函数 | |
4 | 可在节点内使用 | 该表放置在 tikzpicture 环境的一个节点中 |
选项
# | 选项 | 原因 |
---|---|---|
1 | 多个分隔符 | 只要满足前缀和后缀条件,就不需要多个分隔符。 |
2 | 环境而不是函数 | 只要满足前缀和后缀条件,使用函数就不是必要的。 |
其他详细信息
# | 细节 |
---|---|
1 | 我更喜欢使用 xparse \NewDocumentCommand 和 \NewDocumentEnvironment,因为它们可以使用可选参数 |
2 | 只会有 2 列,但行数可能是 20 也可能是 10。 |
3 | 我会多次使用它,因此拥有一个函数会比每次手动执行这个操作容易得多。 |
4 | 最终这将被放入“.sty”文件中。 |
代码
\usepackage{xparse}
\usepackage{pgffor}
\usepackage{listofitems}
\makeatletter
% #1 = Prefix for left column
% #2 = Suffix for right column
% #3 = Left column header
% #4 = Right column header
% #5 = Input List
\NewDocumentCommand{\ptr}{O{} O{"} O{Parameter} O{Value} m}
{
#3 & #4 \\
\setsepchar{;/,}
\readlist\trlist{#5}
\foreach \n in {1,...,\trlistlen}
{
#1\trlist[\n,1] & \trlist[\n,2] #2 \\
\hline
}
\makeatother
\ProcessOptions\relax
\begin{document}
% As Examples
Data 1
\begin{tabular}{| l | r |}
\ptr[groupa00]["]{test1,1;test2,2;test3,3}
\end{tabular}
Data 2
\begin{tabular}{| l | r |}
\ptr[groupb00]["]{test1,1;test2,2;test3,3}
\end{tabular}
\end{document}
输出
输出应如下所示:
数据 1
范围 | 价值 |
---|---|
groupa00测试1 | 1” |
groupa00Test2 | 2” |
groupa00Test3 | 3” |
数据 2
范围 | 价值 |
---|---|
groupb00测试1 | 1” |
groupb00测试2 | 2” |
groupb00Test3 | 3” |
答案1
我不会使用很多可选参数,因为如果您只想要一个,那么您必须使用所有前面的参数。
键值语法似乎更好。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\keys_define:nn { dickstein/tables }
{
lh .tl_set:N = \l_dickstein_tables_lh_tl, % left header
lh .initial:n = Parameter,
rh .tl_set:N = \l_dickstein_tables_rh_tl, % right header
rh .initial:n = Value,
pre .tl_set:N = \l_dickstein_tables_pre_tl, % prefix
post .tl_set:N = \l_dickstein_tables_post_tl, % suffix
}
\seq_new:N \l_dickstein_tables_allrows_seq
\seq_new:N \l_dickstein_tables_onerow_seq
\NewDocumentCommand{\ptr}{O{}m}
{
% #1 = options
% #2 = Input List
\group_begin: % localize the setting of keys
\keys_set:nn { dickstein/tables } { #1 }
% split the input into rows
\seq_set_split:Nnn \l_dickstein_tables_allrows_seq { ; } { #2 }
\begin{tabular}{| l | r |}
\hline
\bfseries \l_dickstein_tables_lh_tl & \bfseries \l_dickstein_tables_rh_tl \\
\hline
% make all rows
\seq_map_function:NN \l_dickstein_tables_allrows_seq \dickstein_tables_row:n
\hline
\end{tabular}
\group_end:
}
\cs_new_protected:Nn \dickstein_tables_row:n
{
% split the input at the comma
\seq_set_from_clist:Nn \l_dickstein_tables_onerow_seq { #1 }
% the prefix
\l_dickstein_tables_pre_tl
% the entries
\seq_use:Nn \l_dickstein_tables_onerow_seq { & }
% the suffix
\l_dickstein_tables_post_tl
\\
}
\ExplSyntaxOff
\begin{document}
Data 1
\ptr[pre=groupa00]{test1,1;test2,2;test3,3}
\medskip
Data 2
\ptr[
pre=groupb00,
post=XYZ,
lh=P,
rh=V
]{test1,1;test2,2;test3,3}
\end{document}
答案2
类似的事情已经被问过这里和那里例如。根据这些问题的答案,可以执行以下操作(虽然这里没有显示,但如果生成的宏在 Ti 中使用,也会起作用钾Z节点):
\documentclass{article}
\usepackage{xparse}
\usepackage{pgffor}
\usepackage{listofitems}
\newtoks\temptabtoks
\newcommand\addtabtoks[1]{\global\temptabtoks\expandafter{\the\temptabtoks#1}}
\newcommand\eaddtabtoks[1]{\edef\etemp{#1}\expandafter\addtabtoks\expandafter{\etemp}}
\newcommand*\resettabtoks{\global\temptabtoks{}}
\newcommand*\printtabtoks{\the\temptabtoks}
% #1 = Prefix for left column
% #2 = Suffix for right column
% #3 = Left column header
% #4 = Right column header
% #5 = Input List
\NewDocumentCommand{\ptr}{O{} O{"} O{Parameter} O{Value} m}{%
\setsepchar{;/,}
\readlist\trlist{#5}
\resettabtoks
\addtabtoks{\hline}
\addtabtoks{\textbf{#3} & \textbf{#4} \\}
\addtabtoks{\hline}
\foreach \n in {1,...,\trlistlen} {
\eaddtabtoks{#1\trlist[\n,1]}
\addtabtoks{&}
\eaddtabtoks{\trlist[\n,2]#2}
\addtabtoks{\\}
\addtabtoks{\hline}
}
\begin{tabular}{| l | r |}
\printtabtoks
\end{tabular}
}
\ProcessOptions\relax
\begin{document}
Data 1
\ptr[groupa00]["]{test1,1;test2,2;test3,3}
\bigskip
Data 2
\ptr[groupb00]["]{test1,1;test2,2;test3,3}
\end{document}
如您所见,我在\ptr
宏中包含了表格环境,这可能不是您想要的(根据要求 3),但可以节省您的一些输入。此外,您可能应该将内部宏重命名为“更安全”的名称,特别是如果您想将其放在文件中时.sty
。