
Provavelmente existem outras maneiras de fazer isso, mas fiquei feliz por ter descoberto que esse código funcionava perfeitamente para minhas necessidades:
\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}
O problema que tenho é se tento armazenar qualquer estilo de fonte na segunda matriz, digamos an \emph{}
no primeiro valor 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}
O que interromperá a compilação. Descobri que alguns outros tipos de comandos são vistos e interpretados corretamente (por exemplo, alguns caracteres especiais \AE
funcionam perfeitamente), mas qualquer comando de estilo de fonte que tentei ( \large
, \textbf{}
, \itshape
, etc.) falhou. Alguma idéia de por que e/ou como eu poderia armazenar alguns estilos de fonte na segunda matriz? Obrigado! :)
Responder1
O problema é que \pgfmathparse
execuções \edef
e comandos como esse \emph
não sobrevivem.
Você obtém o que precisa precedendo esses comandos com \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}
Quais são os comandos “perigosos”? Não é fácil dizer. Mas os comandos de mudança de fonte certamente são, assim como alguns outros que produzem texto.
Uma implementação completamente diferente que não requer nenhuma proteção; a entrada dos grupos foi alterada, mas acredito que um grupo e sua lista correspondente devem ser inseridos juntos.
\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}
Responder2
Opção 1
Você pode armazenar as informações indiretamente. Por exemplo, junto com a chave e o valor, você poderia adicionar um terceiro elemento para sinalizar uma diretiva de formato. Seu código testaria isso e formataria o valor de, por exemplo, \val
apropriadamente.
Observe que o exemplo a seguir funciona adicionando o comando de formatação de textosema barra invertida inicial, por exemploemph
não \emph
. O comando é então reconstruído usando \csname ... \endcsname
. Observe que não tenho ideia se isso é uma boa ideia ou não.
\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}
opção 2
Basta usar o método mencionado na documentação pgf
e proteger os comandos com \noepand
. (Veja, por exemplo, página 529 do manual.)
\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}