如何更改以下内容以便 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