问题

问题

问题

我正在尝试获取基于多个分隔符字符串的表。我目前的想法是使用\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

在此处输入图片描述

相关内容