オプション1

オプション1

おそらく他にも方法はあるでしょうが、このコードが私のニーズにぴったり合うことがわかって嬉しかったです。

\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}

問題は、2 番目の配列にフォント スタイルを保存しようとすると、\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など) は失敗しました。2 番目の配列にフォントスタイル設定を保存できる理由や方法をご存知ですか? ありがとうございます! :)

答え1

問題は、\pgfmathparseperformes\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

情報を間接的に保存することもできます。たとえば、キーと値に加えて、フォーマット ディレクティブを通知する 3 番目の要素を追加できます。その後、コードでそれをテストし、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}

スタイル <code>\val</code>

オプション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}

<code>\noexpand</code> で部分的にスタイル設定された <code>\val</code>

関連情報