未显示第一对 keyval

未显示第一对 keyval

如何更改以下内容以便 name1 和 caption1 也被使用 - 而不仅仅是第二对键:

\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{keyval}

\makeatletter 

\define@key{grid}{name1}{\def\grid@name1{#1}}
\define@key{grid}{caption1}{\def\grid@caption1{#1}}

\define@key{grid}{name2}{\def\grid@name2{#1}}
\define@key{grid}{caption2}{\def\grid@caption2{#1}}

\newcommand{\grid}[2][]{%

\begingroup%

      \setkeys{grid}{#1}  

      \grid@name1 \\  
      \grid@caption1 \\
      \grid@name2 \\  
      \grid@caption2
      
\endgroup%
 
} 
 
\makeatother

\begin{document}

\grid[name1= \detokenize{name_of_file1},
    caption1=My sub caption text 1,
    name2= \detokenize{name_of_file2},
    caption2=My sub caption text 2]

\end{document}

仅返回:

name_of_file2 
My sub caption text 2

答案1

以下原则上与您从以下来源获得的解决方案相同注释(宏名中不要使用数字)

但这修复了更多错误:

  • 您的\grid宏仅接受一个可选参数,没有强制参数。请使用\newcommand\grid[1][]而不是[2][]

  • 如果你使用多个连续的空白行,TeX 会将其转换为\par标记,宏定义也是如此。这很可能不是你想要的(否则,使用显式\par来明确这一点!)。所以我删除了它们。

  • 你不需要在%后面加上(因为是控制字\endgroup,所以没有空格),但是你在\endgroup%\setkeys

  • \usepackage[utf8]{inputenc}对于现代 LaTeX 安装来说不是必需的(但这不是真正的错误)

综合起来:

\documentclass{article}

\usepackage{keyval}

\makeatletter 

\define@key{grid}{name1}{\def\grid@nameA{#1}}
\define@key{grid}{caption1}{\def\grid@captionA{#1}}

\define@key{grid}{name2}{\def\grid@nameB{#1}}
\define@key{grid}{caption2}{\def\grid@captionB{#1}}

\newcommand{\grid}[1][]{%
  \begingroup
    \setkeys{grid}{#1}%
    \grid@nameA \\  
    \grid@captionA \\
    \grid@nameB \\  
    \grid@captionB
  \endgroup
} 
 
\makeatother

\begin{document}

\grid[name1= \detokenize{name_of_file1},
    caption1=My sub caption text 1,
    name2= \detokenize{name_of_file2},
    caption2=My sub caption text 2]

\end{document}

答案2

仅使用字母,按照注释即可解决问题:

\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{keyval}

\makeatletter 

\define@key{grid}{nameA}{\def\grid@nameA{#1}}
\define@key{grid}{captionA}{\def\grid@captionA{#1}}

\define@key{grid}{nameB}{\def\grid@nameB{#1}}
\define@key{grid}{captionB}{\def\grid@captionB{#1}}

\newcommand{\grid}[2][]{%

      \setkeys{grid}{#1}  

      \grid@nameA \\ 
      \grid@captionA \\
      \grid@nameB \\  
      \grid@captionB
} 
 
\makeatother

\begin{document}

\grid[%  
%
nameA= \detokenize{name_of_file1.pdf}, captionA=My sub caption text 1,
nameB= \detokenize{name_of_file2.pdf}, captionB=My sub caption text 2
%
]

\end{document}

name_of_file1.pdf 
My sub caption text 1
name_of_file2.pdf
My sub caption text 2

相关内容