我想要做的是使用新命令设置以默认大小快速插入 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 的建议:
- 用于
\centering
代替\begin{center} ... \end{center}
。请参阅我应该对图形和表格使用 center 还是 centering ?。 - 删除了图形标签中的空格。
- 删除了
[H]
放置选项。请参阅如何影响 LaTeX 中图形和表格等浮动环境的位置? - 已删除
\protect\detokenize
。
代码:
\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