带有宏的 \includegraphics 的文件名

带有宏的 \includegraphics 的文件名

也许我遇到了类似的问题这个问题, 也

我必须承认,我不明白第二个链接中 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

相关内容