可能还有其他方法可以做到这一点,但我很高兴发现这个代码可以满足我的需要:
\documentclass{article}
\usepackage{tikz}
\newcounter{grpcnt}
\def\groups{grp1, grp2, grp3}
\def\keyvals{{ {"key 00/val 00, key 01/val 01"}, {"key 10/val 10, key 11/val 11, key 12/val 12"}, {"key 20/val 20"} }}
\begin{document}
\setcounter{grpcnt}{0}
\foreach \grp in \groups {
\section*{\grp}
\pgfmathparse{\keyvals[\thegrpcnt]}
\foreach \key/\val in \pgfmathresult
{
\textbf{\key}: \val \\[1ex]
}
\addtocounter{grpcnt}{1}
}
\end{document}
我遇到的问题是,如果我尝试在第二个数组中存储任何字体样式,比如\emph{}
第一个值 00:
\documentclass{article}
\usepackage{tikz}
\newcounter{grpcnt}
\def\groups{grp1, grp2, grp3}
\def\keyvals{{ {"key 00/val \emph{00}, key 01/val 01"}, {"key 10/val 10, key 11/val 11, key 12/val 12"}, {"key 20/val 20"} }}
\begin{document}
\setcounter{grpcnt}{0}
\foreach \grp in \groups {
\section*{\grp}
\pgfmathparse{\keyvals[\thegrpcnt]}
\foreach \key/\val in \pgfmathresult
{
\textbf{\key}: \val \\[1ex]
}
\addtocounter{grpcnt}{1}
}
\end{document}
这将破坏编译。我发现其他一些类型的命令可以正确查看和解释(例如,一些特殊字符如\AE
工作正常),但我尝试过的任何字体样式命令(\large
、\textbf{}
、\itshape
等)都失败了。知道为什么和/或如何在第二个数组中存储一些字体样式吗?谢谢!:)
答案1
问题在于诸如此类的\pgfmathparse
执行\edef
和命令\emph
无法生存下来。
你可以在这样的命令前加上\noexpand
:
\documentclass{article}
\usepackage{tikz}
\newcounter{grpcnt}
\def\groups{grp1, grp2, grp3}
\def\keyvals{{ {"key 00/val \noexpand\emph{00}, key 01/val 01"},
{"key 10/val 10, key 11/val 11, key 12/val 12"}, {"key 20/val 20"} }}
\begin{document}
\setcounter{grpcnt}{0}
\foreach \grp in \groups {%
\section*{\grp}
\pgfmathparse{\keyvals[\thegrpcnt]}
\foreach \key/\val in \pgfmathresult
{%
\textbf{\key}: \val \\[1ex]
}%
\addtocounter{grpcnt}{1}%
}
\end{document}
哪些命令是“危险的”?很难说清楚。但字体更改命令肯定是危险的,还有一些其他文本生成命令。
完全不同的实现,不需要任何保护;组的输入发生了变化,但我认为组和其对应的列表应该一起输入。
\documentclass{article}
\usepackage{xparse,indentfirst}
\ExplSyntaxOn
\NewDocumentCommand{\definegroup}{mm}
{
\shrodi_define_group:nn { #1 } { #2 }
}
\NewDocumentCommand{\processgroups}{ }
{
\shrodi_process_groups:
}
\seq_new:N \g_shrodi_groups_seq
\cs_new:Npn \__shrodi_make_name:n #1
{
g_shrodi_\tl_to_str:n{#1}_clist
}
\cs_new_protected:Npn \shrodi_define_group:nn #1 #2
{
\seq_gput_right:Nn \g_shrodi_groups_seq { #1 }
\clist_new:c { \__shrodi_make_name:n { #1 } }
\clist_gset:cn { \__shrodi_make_name:n { #1 } } { #2 }
}
\cs_new_protected:Npn \shrodi_process_groups:
{
\seq_map_inline:Nn \g_shrodi_groups_seq
{
\section* { ##1 }
\clist_map_inline:cn { \__shrodi_make_name:n { ##1 } }
{
\shrodi_print_contents:nn ####1
}
}
}
\cs_new_protected:Npn \shrodi_print_contents:nn #1 #2
{
\textbf{ #1 }: ~ #2 \par \medskip
}
\ExplSyntaxOff
\definegroup{grp1}{
{key 00}{val \emph{00}},
{key 01}{val 01}
}
\definegroup{grp2}{
{key 10}{val 10},
{key 11}{val 11},
{key 12}{val 12}
}
\definegroup{grp3}{
{key 20}{val 20}
}
\begin{document}
\processgroups
\end{document}
答案2
选项1
您可以间接存储信息。例如,除了键和值之外,您还可以添加第三个元素来表示格式指令。然后您的代码将测试该元素并\val
适当地格式化例如的值。
请注意,以下示例通过添加文本格式化命令来实现没有前导反斜杠例如emph
不是 \emph
。然后使用重建命令\csname ... \endcsname
。请注意,我不知道这是不是一个好主意。
\documentclass{article}
\usepackage{tikz}
\newcounter{grpcnt}
\def\groups{grp1, grp2, grp3}
\def\keyvals{{ {"key 00/val 00/emph, key 01/val 01"}, {"key 10/val 10, key 11/val 11, key 12/val 12"}, {"key 20/val 20"} }}
\begin{document}
\setcounter{grpcnt}{0}
\foreach \grp in \groups {
\section*{\grp}
\pgfmathparse{\keyvals[\thegrpcnt]}
\foreach \key/\val/\form in \pgfmathresult
{
\edef\tempa{}%
\edef\tempb{\form}%
\textbf{\key}: \ifx\tempa\tempb\val\else\expandafter\csname\form\endcsname{\val}\fi \\[1ex]
}
\addtocounter{grpcnt}{1}
}
\end{document}
选项 2
只需使用文档中提到的方法pgf
并用 保护命令即可\noepand
。(例如,参见手册第 529 页。)
\documentclass{article}
\usepackage{tikz}
\newcounter{grpcnt}
\def\groups{grp1, grp2, grp3}
\def\keyvals{{ {"key 00/val \noexpand\emph{00}, key 01/val 01"}, {"key 10/val 10, key 11/val 11, key 12/val 12"}, {"key 20/val 20"} }}
\begin{document}
\setcounter{grpcnt}{0}
\foreach \grp in \groups {
\section*{\grp}
\pgfmathparse{\keyvals[\thegrpcnt]}
\foreach \key/\val in \pgfmathresult
{
\textbf{\key}: \val \\[1ex]
}
\addtocounter{grpcnt}{1}
}
\end{document}