
Вероятно, есть и другие способы сделать это, но я был рад, что этот код отлично подходит для моих нужд:
\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
работают просто отлично), но любая команда font syling, которую я пробовал ( \large
, \textbf{}
, \itshape
, и т. д.), не удалась. Есть идеи, почему и/или как я могу сохранить некоторые стили шрифта во 2-м массиве? Спасибо! :)
решение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
Вы можете хранить информацию косвенно. Например, вместе с ключом и значением вы можете добавить третий элемент, чтобы обозначить директиву формата. Затем ваш код будет проверять это и форматировать значение eg \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}