根据条件插入标题

根据条件插入标题

我在编写宏时遇到了问题。我的想法是,我试图设置一个(简单)宏来保存文章中的图片,但并非所有图片都有标题,因此我希望该宏具有设置以下内容的选项:

  1. 图片来源(例如,my_figure.png)
  2. 相对于 \textwidth 的宽度(例如,0.8 -> 80% 的文本宽度)
  3. 如果需要的话,请提供标题。

通过使用 \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}使用该命令的原因。

相关内容