命令参数内的条件测试

命令参数内的条件测试

如果我提供的数字>= 1,我想\includegraphics使用参数进行调用,否则。我已经看到了这个:width= #1\textwidth\mycmdscale= #1我可以使用 graphicx 有条件地缩放图像吗但是我更喜欢保留我的代码因为它更简单,我既不想要重复的代码也不想有\ifthenelse(重复整个命令\includegraphics)我没有成功在命令参数中使用它:\includegraphics[\ifthenelse...],最好只改变里面的参数,所以我需要在命令参数里面进行可扩展的条件测试,如果我可以避免在 OR 中重复就好了\mytest

附言:我尝试过\ifnumequal但它只接受自然数,所以没有帮助。

\documentclass{report}
\usepackage{graphicx}
\usepackage{etoolbox}

\makeatletter
\def\mycmd{\@ifnextchar[{\@mycmdwith}{\@mycmdwithout}}
\def\@mycmdwith[#1](#2,#3,#4){
\ifnum#2>=1
\begin{figure}
\includegraphics[width=#2\textwidth]{#3}
\caption[#1]{#4}
\end{figure}
\else
\begin{figure}
\includegraphics[scale=#2]{#3}
\caption[#1]{#4}
\end{figure}
\fi
}

\def\@mycmdwithout(#1,#2,#3){
\ifnum#1>=1
\begin{figure}
\includegraphics[width=#1\textwidth]{#2}
\caption{#3}
\end{figure}
\else
\begin{figure}
\includegraphics[scale=#1]{#2}
\caption{#3}
\end{figure}
\fi
}
\makeatother

\begin{document}
\mycmd(1,example-image-A,test)
\mycmd[test](1,example-image-A,test)
\end{document}

答案1

要求类似这样的内容毫无意义width=1.2\textwidth:如果第一项大于 1,则图像将缩放到比文本宽度更宽。而且混合scalewidth相当可疑。

然而,顾客永远是对的。;-)

\documentclass{article}
\usepackage{graphicx,xparse}

\NewDocumentCommand{\mycmd}{o >{\SplitArgument{2}{,}}r()}{%
  \IfNoValueTF{#1}
    {\mycmdInternalNoOpt#2}
    {\mycmdInternalOpt#2{#1}}%
}
\NewDocumentCommand{\mycmdInternalNoOpt}{mmm}{%
  \mycmdInternalOpt{#1}{#2}{#3}{#3}%
}

\ExplSyntaxOn
\NewDocumentCommand{\mycmdInternalOpt}{mmmm}
 {
  \fp_compare:nTF { #1 >= 1 }
   {
    \includegraphics[width=#1\textwidth]{#2}
   }
   {
    \includegraphics[scale=#1]{#2}
   }
  \caption[#4]{#3}
 }
\ExplSyntaxOff

\begin{document}

\listoffigures

\begin{figure}
\centering

\mycmd(1,example-image-a,test)

\mycmd[testopt](0.5,example-image-a,test)

\end{figure}

\end{document}

图表列表(显示可选参数被接受)

在此处输入图片描述

包含图片的页面

在此处输入图片描述

只需出现一次\includegraphics

\NewDocumentCommand{\mycmdInternalOpt}{mmmm}
 {
  \use:x
   {
    \exp_not:N \includegraphics
     [
      \fp_compare:nTF { #1 >= 1 } { width=#1\textwidth } { scale=#1 }
     ]{#2}
   }
  \caption[#4]{#3}
 }

答案2

请求的语法看起来很奇怪,但是 width= 和 scale= 只是缩放的变体,宽度意味着缩放自然宽度,因此您只需要以下内容即可避免重复\includegraphics

在此处输入图片描述

\documentclass{article}
\usepackage{graphicx}

\makeatletter
\newcommand\zz[1]{#1\ifdim#1pt<1pt \Gin@nat@width\else\textwidth\fi}
\makeatother

\begin{document}
\vspace*{-4cm}
\enlargethispage{4cm}
\centering

X\dotfill X

\includegraphics[width=\zz{1.2}]{example-image}

\includegraphics[width=\zz{1}]{example-image}

\includegraphics[width=\zz{0.5}]{example-image}


\end{document}

相关内容