我必须承认,我不明白第二个链接中 David Carlisle 给出的有关直接扩展的答案,所以我无法将他的解决方案应用到我的情况中。:-(
我收藏了超过 60 个徽标文件。徽标文件名由多个部分组成,每个部分代表一些规范(例如德语与英语,...)。
我想创建一个宏,它将接收有关一个或两个组件的输入,并计算所需的徽标文件名,该文件名应交给 includegraphics,用作强制括号中的输入。
当然,计划中的宏比这个 MWE 稍微复杂一些,但它很好地展示了我实际的问题。我的目的是,返回一个像 LOGO-compA-compB-compC 这样的字符串作为宏的结果。(徽标文件将在 TEXMF 树上找到,我只计算文件的名称。)
\documentclass[parskip=full]{scrartcl}
\usepackage{graphicx}
%%% New commands, to compute a grahics file name.
%% Simple
\newcommand{\foo}{example-image-c}
%% Defining one argument, which is not used.
\newcommand{\baz}[1]{example-image-b}
%% Enabling a default for the argument.
\newcommand{\foobar}[1][example-image-a]{#1}
\begin{document}
\includegraphics[height=.7cm]{\foo} \\ % works
\includegraphics[height=.7cm]{\baz{}} \\ % Works also
%% won't work. Missing endcsname inserted??
\includegraphics[height=.7cm]{\foobar[example-image-c]} \\
%% Won't work either
\includegraphics[height=.7cm]{\foobar} \\
\includegraphics[height=.7cm]{\foobar[example-image-c]} \\
\end{document}
让它发挥作用的诀窍是什么?
答案1
正如 Skillmon 所展示的,可以有一个在 的参数中工作的可扩展命令\includegraphics
,但更容易的是反转调用顺序并在进入 的仅扩展文件名解析之前处理参数和任何其他处理\includegraphics
\documentclass[parskip=full]{scrartcl}
\usepackage{graphicx}
%%% New commands, to compute a grahics file name.
%% Simple
\NewDocumentCommand{\foo}{o}{\includegraphics[#1]{example-image-c}}
%% Defining one argument, which is not used.
\NewDocumentCommand{\baz}{om}{\includegraphics[#1]{example-image-b}}
%% Enabling a default for the argument.
\NewDocumentCommand{\foobar}{oO{example-image-a}}{\includegraphics[#1]{#2}}
\begin{document}
\foo[height=.7cm] \\ % works
\baz[height=.7cm]{} \\ % works
%% won't work. Missing endcsname inserted??
\foobar[height=.7cm][example-image-c] \\
%% Won't work either
\foobar[height=.7cm] \\
\foobar[height=.7cm][example-image-c]
\end{document}
答案2
您是否有兴趣使用可扩展的 key=value 解决方案?这使用包expkv-cs
。
\documentclass[]{article}
\usepackage[]{graphicx}
\usepackage{expkv-cs}
\ekvcHash\foo
{
lang=en
,size=small
,color=green
}
{%
LOGO-\ekvcValue{lang}{#1}-\ekvcValue{size}{#1}-\ekvcValue{color}{#1}%
}
\ekvcSecondaryKeys\foo
{
nmeta mylogo = {lang=de, size=gigantic, color=blue}
}
\newcommand\testfoo[1]
{%
\typeout{\foo{#1}}%
}
\begin{document}
\testfoo{size=large}
\testfoo{color=red}
\testfoo{color=orange,size=medium,lang=de}
\testfoo{mylogo}
\end{document}
终端上输出:
LOGO-en-large-green
LOGO-en-small-red
LOGO-de-medium-orange
LOGO-de-gigantic-blue