在新命令中,引用列表列出参数而不是实际参数的文本

在新命令中,引用列表列出参数而不是实际参数的文本

我想要做的是使用新命令设置以默认大小快速插入 pdf \zfh问题在于标签以及它在我的标签列表数据库中的列出方式。

例子: \zhf{FileLocation}{xpicture} 我的标签列表中有“fig_ #3”,而不是列出“fig_ xpicture”

我是乳胶的新手,如果能得到任何帮助我将非常感激,如果有更好的方法来解决这个问题,我会很高兴听到。

\documentclass[10pt,a4paper]{article}

\usepackage{graphicx}

\begin{document}

\newcommand{\zfh}[3][2in]{
    \begin{figure}[H]
        \begin{center}
           \includegraphics[height= #1]{./FT/#2}
        \end{center}
        \caption{\protect\detokenize{#3}}
        \label{fig_  #3}
    \end{figure}
    }

    \zfh{zzz.pdf}{XCaption}

    \ref{fig_  #3}  % fig_ #3 is listed instead of the actual text inserted as the #3 arg
\end{document}

答案1

要解决主要问题,您需要使用\ref{fig_ XCaption}来引用该图。第二个可选参数是\zfh用于标签的内容,因此需要在 中使用\ref{},而不是#3

在下面的 MWE 中,我采纳了 David Carlisle 和 egreg 的建议:

代码:

\documentclass[10pt,a4paper]{article}

\usepackage[demo]{graphicx}

\newcommand{\zfh}[3][2in]{
    \begin{figure}
        \centering
        \includegraphics[height= #1]{./FT/#2}
        \caption{#3}
        \label{fig_#3}
    \end{figure}
    }

\begin{document}
    \zfh{zzz.pdf}{XCaption}

    See Figure~\ref{fig_XCaption}  % Figure 1 is inserted as desired
\end{document}

答案2

可能您正在使用某种智能编辑器,它会尝试 \label在 TeX 源代码中查找命令,并在您输入时提供标签名称列表\ref。问题是\label出现在定义内部,而您的编辑器只看到\label{fig_#3},但忽略了 的调用 \zfh。您的编辑器不是 TeX,因此它不知道 \newcommands 启动了一个定义,并且必须用#3第三个参数替换。我不知道您使用的是哪种编辑器,但我怀疑它是否可以轻松地教会它如何处理\zfh。但也许您可以通过改变 的调用方式来欺骗您的编辑器,\zfh并且\label定义内部的 可能也可以被隐藏。

\documentclass[10pt,a4paper]{article}

\usepackage{graphicx}
\usepackage{float}

\newcommand*{\RemoveFigPrefix}{}%
\def\RemoveFigPrefix#1_{}

\newcommand*{\zfh}[2][2in]{%
  \zfhLabel{#1}{#2}%
}
\newcommand*{\zfhLabel}{}
\edef\zfhLabel{%
  \def\noexpand\zfhLabel##1##2%
  \expandafter\noexpand\csname label\endcsname
}\zfhLabel#3{%
  \begin{figure}[H]% see comments
    \centering % see comments
    \includegraphics[height=#1]{./FT/#2}
    \caption{\RemoveFigPrefix#3}
    \csname label\endcsname{#3}%
  \end{figure}%
}

\begin{document}

  \listoffigures

  \section*{Section with figures}

  \zfh[1in]{zzz.pdf}\label{fig_XCaption}

  \zfh[1in]{foo.pdf}\label{fig_YPic}

  Two figures \ref{fig_XCaption} and \ref{fig_YPic}.

\end{document}

一些解释:

  • 一些宏定义是使用 TeX 的 完成的\def,因为它允许更强大的参数文本。但它不会检查命令是否已定义,它只是覆盖宏的先前含义。因此,如果\newcommand宏已定义,则添加行以使 LaTeX 有机会发出错误消息。

  • \label定义内部使用 和 隐藏。\csname这些\endcsname命令构成命令令牌:

    \csname label\endcsname => \label 
    
  • 如果编辑器读取\zfh{...}{...}\label{...},它就会理解\label{...}。但是我们想重用 的参数\label作为标题。因此\label{...}是 语法的必需部分\zfh,并且在 的执行过程中被消耗\zfh。尽管如此,\zfh最终还是会调用\label{...}

  • 为了使 的定义\zfh更容易,定义被分成两个宏。第一个宏扫描可选参数和第一个强制参数;第二个宏\zfhLabel负责这\label{...}部分。在 的定义中,\zfhLabel还有另一个\label可能会让编辑器感到困惑(或者不会,因为缺少花括号,但谁知道呢?):

    \def\zfhLabel#1#2\label#3{%
    

    这是被混淆的

    \edef\zfhLabel{%
      \def\noexpand\zfhLabel##1##2%
      \expandafter\noexpand\csname label\endcsname
    }\zfhLabel#3{%
    

    初学者无需理解这一点。经验丰富的人会发现 的第一个定义\zfhLabel只是一个临时定义,它构成了 的最终定义的一部分\zfhLabel

如果您想引用图形,我们希望您的编辑器现在能够找到\label上述 TeX 源代码中更改的所有正确命令,忽略 内部定义并为您提供完整的标签列表。\label

相关内容