
아마도 다른 방법이 있을 수 있지만 이 코드가 내 요구 사항에 맞게 작동한다는 것을 알게 되어 기뻤습니다.
\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}