選項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}

我遇到的問題是,如果我嘗試在第二個陣列中儲存任何字體樣式,例如\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}

樣式為 <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>\val</code> 和 <code>\noexpand</code>

相關內容