有条件地包含 TikZ 图形

有条件地包含 TikZ 图形

我对图形有以下构造。背景是,当\submit定义时,只包含标题,但不包含图形。否则包含图形。

问题是我有两个地方需要放置相同的标题。保持同步很麻烦。我希望有一种简单的方法可以将文本保存为一个值,并将其输入到两个地方。我有多个这样的图形,所以我想以尽可能通用的方式执行此操作。因此,如果我有 n 个图形,我希望一个命令或函数(而不是 n 个)来完成这项工作。此外,这是针对不喜欢额外软件包的期刊,所以我需要一个不需要特殊软件包的解决方案。我还对使用不同方法的解决方案感兴趣。

\newcommand{\figlegend}{% figure legend
  \refstepcounter{figure}% Increment counter for correct referencing
}
\ifdefined\submit \figlegend
Caption text
\label{schema}
\else
\par \mbox{}
\par
\begin{figure}[tp]
  \begin{center}
    \tikzsetnextfilename{Figure1-schema}
    \input{SCHEMA}
    \caption{%
        Caption text
            }
    \label{schema}
  \end{center}
\end{figure}
\fi

编辑:我编辑了标题以更准确地反映我在这里尝试做的事情。@Mike Renfro 认为可以通过不包括\submit活动图来解决问题。因此,我已将代码更改为我实际使用的代码。\input{SCHEMA}输入SCHEMA.tex包含 TikZ/PGF 代码的文件。

EDIT2:再次编辑标题。不同寻常的是,我接受了一个没有回答我原始问题的答案。@麦克伦弗洛令人信服地证明了我问错了问题。我认为他对我没有问的问题给出了更好的答案,即如何抽象出我的条件构造。谢谢 Mike!

作为参考,我包括了图表制作指南有关期刊的,有关公共科学图书馆

答案1

这听起来像这个问题,至少对于这个特定的应用程序来说是这样。在这种情况下,类似这样的内容:

\documentclass{article}
\usepackage[demo]{graphicx} % demo option only useful for demonstration purposes
%\newcommand{\submit}{1}
\ifdefined\submit
  \relax
\else
  \renewcommand{\includegraphics}[2][]{\fbox{}}
\fi
\begin{document}
Here's some text.
\begin{figure}[tp]
  \centering
  \includegraphics[width=0.5\textwidth]{foo}
  \caption{Some text}
  \label{schema}
\end{figure}

\end{document}

返回

在此处输入图片描述

如果提交定义被注释(即单独的草稿模式),并且

在此处输入图片描述

如果它是活动的(即准备提交)。如果对额外包的限制不是绝对的,您也可以使用 documentclass 的现有草稿模式,并使用草案包裹。

编辑——修改后的版本逻辑相反(\submit意味着省略图形),当图形被隐藏时,除了标题外没有输出。将上面的\ifdefined...\fi块替换为:

\ifdefined\submit
  \renewcommand{\includegraphics}[2][]{\relax}
\else
  \relax
\fi

第二次编辑--为了使这项工作不简单地重新定义\includegraphics

定义提交:

在此处输入图片描述

无需提交定义:

在此处输入图片描述

\documentclass{article}
\usepackage{tikz} \usetikzlibrary{external} \tikzexternalize
\newcommand{\figlegend}{% figure legend
  \refstepcounter{figure}% Increment counter for correct referencing
}
\newcommand{\submit}{1}
\ifdefined\submit
  \newcommand{\makefigure}[3]{\figlegend #2 \label{#1}}
\else
  \newcommand{\makefigure}[3]{%
    \par
    \mbox{}
    \par
    \begin{figure}[tp]
      \centering
      \tikzsetnextfilename{figure-#3} \input{#3}
      \caption{#2}
      \label{#1}
    \end{figure}
}
\fi
\begin{document}

Here's some text.

\makefigure{schema}{The Caption}{basic}

\end{document}

如果由于某种原因您需要对生成的图形进行额外的控制,请向定义添加额外的参数\makefigure#相应地插入占位符。

答案2

你可以使用

\newcommand{\sometext}{Some text}

这也允许传递附加参数,请参阅维基百科。我不确定这是否是简单字符串替换的首选方法。

答案3

(基于@0x06d64 的回答。)我猜最“类似 LaTeX”的做法是使用 来\newcommand保存文本(下面的第一行),但该定义将仅限于\savestring出现的环境。如果您希望能够\savestring在环境内部使用,而#1仍在外部定义,则需要进行全局分配,例如使用\gdef。由于这是 TeX 原语,\gdef{#1}{#2}因此不起作用。

%\newcommand{\savestring}[2]{\newcommand{#1}{#2}}
\newcommand{\savestring}[2]{\gdef#1{#2}}

用作\savestring\stringA{Some text to save} ... \stringA

其实,我们可以直接使用\gdef\stringA{Some text to save}。不知道我在想什么。

相关内容