如何以最少的代码重复有条件地控制图形的宽度?

如何以最少的代码重复有条件地控制图形的宽度?

我用来\iftoggle在可供审阅(双倍行距,单列)和可供拍照(单倍行距,双列)的布局之间切换。

我想根据切换按钮将图形的宽度更改为最佳宽度。我还想在不复制所有图形标记的情况下执行此操作。

本质上,我想要在 CPP 中实现以下等价的东西:

#define DRAFT 1
#if DRAFT
#define FIGWIDTH 0.45\columnwidth
#else
#define FIGWIDTH 0.9\columnwidth
#end

... lots of complex figure/subfigure crap
\includegraphics[width=FIGWIDTH]{pretty-diagram.pdf}
... etc

做到这一点的最好方法是什么?

答案1

\iftoogle的宏是etoolbox可扩展的,因此您可以在宽度参数中直接使用它,因为两个子句都可以扩展为长度。

您可以使用:

\includegraphics[width=\iftoggle{review}{0.45\columnwidth}{0.9\columnwidth}]{<figure>}

或者使用宏来实现这一点:

\newcommand*{\figwidth}{\iftoggle{review}{0.45\columnwidth}{0.9\columnwidth}}
% ...
\includegraphics[width=\figwidth]{<figure>}

或者如果你想要针对不同的数字采用不同的因素:

\newcommand*{\figwidth}[2]{\iftoggle{review}{#1\columnwidth}{#2\columnwidth}}
% ...
\includegraphics[width=\figwidth{0.45}{0.9}]{<figure>}

或者,更一般地:

\newcommand*{\figwidth}[2]{\iftoggle{review}{#1}{#2}}
% ...
\includegraphics[width=\figwidth{0.45\columnwidth}{0.9\columnwidth}]{<figure>}

只需保持宏完全可扩展,例如不要使用可选参数。

答案2

您可以使用以下方式定义特定于切换的长度

\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newtoggle{review} \newlength{\figwidth}
%\settoggle{review}{true}% In "review" mode
\iftoggle{review}%
  {\setlength{\figwidth}{0.45\columnwidth}}% In "review" mode/true
  {\setlength{\figwidth}‌​{0.9\columnwidth}}% Not in "review" mode/false

然后使用

\includegraphics[width=\figwidth]{<figure>}

针对您所包含的图像。

答案3

ConTeXt 提供了一种机制来对图像的多个设置进行分组,包括width。我将举一个不同的例子来说明这一点。我经常使用相同的源来生成课程笔记和讲座幻灯片。对于某一类图形,在幻灯片中,我希望图形缩放直到其宽度等于\textwidth或高度等于\textheight;而在讲义中,我希望图形宽度小于0.5\textwidth。这可以使用

\doifmodeelse{screen}
    {\defineexternalfigure[display][maxwidth=\textwidth,maxheight=\textheight,factor=max]}
    {\defineexternalfigure[display][width=0.5\textwidth]}

然后使用

\externalfigure[filename][display]

在文本文件中。然后,根据screen模式是否处于活动状态,\externalfigure命令将继承适当的设置集。此机制比单独切换每个参数更强大\externalfigure

相关内容