我在编写宏时遇到了问题。我的想法是,我试图设置一个(简单)宏来保存文章中的图片,但并非所有图片都有标题,因此我希望该宏具有设置以下内容的选项:
- 图片来源(例如,my_figure.png)
- 相对于 \textwidth 的宽度(例如,0.8 -> 80% 的文本宽度)
- 如果需要的话,请提供标题。
通过使用 \newcommand 宏我可以实现这一点:
\usepackage{ifthen}
\newcommand*\tkzimage[3]{%
\begin{figure}[h!]
\centering
\begin{tikzpicture}
\node[inner sep=0pt] (w) at (0,0)
{\includegraphics[width=#2\textwidth]{images/#1}};
\end{tikzpicture}
\ifthenelse{\equal{#3}{}}{ }{\caption{#3}}
\end{figure}
}
\caption{<whatever>}
我遇到的问题是,当调用宏时,我得到了预期的行为,但如果我没有空槽,代码就不起作用:
\ifthenelse{\equal{#3}{}}{}{\caption{#3}} % Throws an error.
\ifthenelse{\equal{#3}{}}{ }{\caption{#3}} % Throws an error.
\ifthenelse{\equal{#3}{}}{<whatever>}{\caption{#3}} % Throws an error.
\ifthenelse{\equal{#3}{}}{\caption{<whatever>}>}{\caption{#3}} % Works!
该函数被调用如下:
\tkzimage{image\_text.png}{0.5}{} # With NO caption.
\tkzimage{image\_text.png}{0.5}{Some text} # With some caption.
我很困惑为什么会出现这种情况以及如何解决它。该pgfkeys
软件包也无法正常工作,所以我不知道如何解决这个问题;如果能得到帮助我将不胜感激。
编译器错误
当使用上述代码时不带 \caption 代码:
LaTeX Warning: `!h' float specifier changed to `!ht'.
File: images/pycharmInstallation000.png Graphic file (type png)
<use images/pycharmInstallation000.png>
Package luatex.def Info: images/pycharmInstallation000.png used on input line 18.
(luatex.def) Requested size: 234.73523pt x 189.33287pt.
./aaf_introduction_neovim.tex:18: Package hypcap Error: You have forgotten to use \caption.
谢谢!
答案1
如果可能有或可能没有标题,那么它是一个可选参数。
这里我还提供了额外的设置\includegraphics
以及图表列表的可选简短标题。
请注意,这\begin{figure}[!h]
是错误的,因为它可能会阻塞队列并导致在文档(或章节)末尾传送所有后续图表。
顺便问一下,在干什么tikzpicture
?
\documentclass{article}
\usepackage{tikz}
\usepackage{graphicx}
\NewDocumentCommand{\tkzimage}{mO{}moo}{%
\begin{figure}[!htp]% <--- not just !h, it's wrong
\centering
\begin{tikzpicture}
\node[inner sep=0pt] (w) at (0,0) {%
\includegraphics[width=#1\textwidth,#2]{#3}%
};
\end{tikzpicture}
\IfValueT{#4}{% there's a caption
\IfNoValueTF{#5}{% no short caption
\caption{#4}%
}{% there's a short caption
\caption[#4]{#5}%
}%
}
\end{figure}
}
\begin{document}
\listoffigures
\section{Test}
\tkzimage{0.2}{example-image-a}[A caption]
\tkzimage{0.2}{example-image-b}[Short caption for lof][A veeeeeeeeeeery long caption]
\tkzimage{0.2}[angle=90]{example-image-c}
\end{document}
答案2
这是我找到的解决方案,它不是最优雅的解决方案,但对我来说很有用:
\usepackage{ifthen}
\usepackage{caption}
\newcommand*\tkzimage[3]{
\begin{figure}[h!]
\centering
\begin{tikzpicture}
\node[inner sep=0pt] (w) at (0,0)
{\includegraphics[width=#2\textwidth]{images/#1}};
\end{tikzpicture}
\ifthenelse{\equal{#3}{}}{
\captionsetup{labelformat=empty}
\caption[]{}
\addtocounter{figure}{-1}
}
{
\caption{#3}
}
\end{figure}
}
请注意,每次figure
调用环境时,figure
计数器都会增加,因此,如果没有添加标题,则计数器不应增加;即净增量必须为零,这就是\addtocounter{figure}{-1}
使用该命令的原因。