从环境中提取命令

从环境中提取命令

floatrow 中 tikz 图像的自动缩放我问的是如何将一行中的多幅图像缩放到相同的高度,并将结果行缩放到线宽。

我想进一步自动化这个过程,并想知道是否可以定义一个如下的环境(所需的行为将在下面解释):

\begin{scaleRow}[\linewidth]
  \somecode{\scaledImage{image1code}}
  \othercode
  \somecode{\scaledImage{image2code}}
  ...
  \othercode\maybeDifferent
  \somecode{\scaledImage{image<N>code}}
\end{scaleRow}

环境应该收集里面的所有代码\scaledImage,所以我可以使用回答自动针对所引用的问题计算每个图像的缩放比例。

运行这些计算后,我想用我计算的替换和\scaledImage{code}里面的code每一个出现,并在环境中实际呈现代码。\scalefactorcodescalefactor

我之所以要渲染图像两次是因为我打算使用tikzscale,否则我可以用我需要计算宽度的code方法来代替。savebox

注意:我希望至少自己尝试一些必要的编码,以便开始使用乳胶编码,但我是一个完全的新手,虽然我确信其中大部分是可行的,但我不确定从scaledImage环境中提取部分。我希望得到一个好的指示,这样我就可以尝试从这一点开始可以组合起来的东西。

让事情稍微困难的是,我害怕副作用。所以我认为,如果计数器被修改,那么仅仅执行两次所有代码(一次隐藏,例如将其放入 sbox 中或以某种方式丢弃其输出)是危险的。

答案1

您的规范有些模糊,所以我可能在解释您想要做的事情时有些随意。

对于那些不熟悉您之前问题的人,我应该在这里指出,您要求并且我介绍了“行图”的概念,它由各种大小的子图构成,所有这些子图都将被缩放(保留纵横比)以占据用户指定的整体宽度(默认\textwidth)。

我介绍了在环境中运行的以下命令:

\rowfigurewidth{指定行图的宽度} - 默认为\textwidth

\startrowfigure[起始子图编号]{最左边的图像存储在新的行图中}

\addrowfigure{存储在当前行图右端的图形}

\presentrowfigure - 重新构造当前行图

\showrowfigure{}{}{}{}- 格式化行图的每个子图组件的宏(不是由用户调用,但决定所呈现的行图的格式)

rowfigcount\therowfigcount如果希望继续执行后续行(通过作为可选参数)\startrowfigure,则是包含所用子图的当前值的计数器。

示例用法如下:

\begin{figure}[ht]
\startrowfigure{\figa}
\addrowfigure{\figb}
\addrowfigure{\figc}
\addrowfigure{\figd}
\presentrowfigure
\end{figure}

完整代码如下:

\documentclass{article}
\usepackage{scalerel}
\usepackage{fp}
\usepackage{stackengine}
\def\stacktype{L}
\usepackage{xcolor}
\newcount\figwidthc
\newcount\textwidthc
\newcounter{rowfigcount}
\newcounter{rowfigindex}
\newsavebox\compositefig
\newlength\rowfigwidth
\def\rowfigwidthstring{\textwidth}
\newcommand\rowfigurewidth[1]{\edef\rowfigwidthstring{#1}}
\newcommand\startrowfigure[2][0]{%
  \sbox\compositefig{#2}%
  \edef\rowfigstart{#1}%
  \setcounter{rowfigcount}{#1}%
  \addtocounter{rowfigcount}{1}%
  \expandafter\def\csname rowfig\roman{rowfigcount}\endcsname{#2}%
}
\newcommand\addrowfigure[1]{%
  \sbox\compositefig{\scalerel{\usebox{\compositefig}}{$#1$}}%
  \addtocounter{rowfigcount}{1}%
  \expandafter\def\csname rowfig\roman{rowfigcount}\endcsname{#1}%
}
\newcommand\presentrowfigure{%
  \figwidthc=\wd\compositefig%
  \setlength{\rowfigwidth}{\rowfigwidthstring}%
  \textwidthc=\rowfigwidth%
  \FPdiv\scaleratio{\the\textwidthc}{\the\figwidthc}%
  \setcounter{rowfigindex}{\rowfigstart}%
  \whiledo{\value{rowfigindex} < \value{rowfigcount}}{%
    \stepcounter{rowfigindex}%
    \showrowfigure%
      {\scaleratio}%
      {\alph{rowfigindex}}%
      {\csname rowfig\roman{rowfigindex}\endcsname}%
      {\csname rowfig\roman{rowfigcount}\endcsname}%
  }
}
\newcommand\showrowfigure[4]{%
  \stackunder{\scalebox{#1}{\scalerel*{$#3$}{$#4$}}}{(#2)}%
}
\begin{document}
\def\figa{\color{blue}\rule{.5in}{.7in}}
\def\figb{\color{red}\rule{.7in}{.3in}}
\def\figc{\color{green}\rule{.4in}{.5in}}
\def\figd{\color{black}\rule{1.in}{.8in}}

\def\fige{\color{red}\rule{1.5in}{.7in}}
\def\figf{\color{cyan}\rule{1.7in}{1.3in}}
\def\figg{\color{magenta}\rule{1.4in}{1.5in}}
\def\figh{\color{black}\rule{1.in}{.8in}}

Here I demonstrate row figures:

\begin{figure}[ht]
\startrowfigure{\figa}
\addrowfigure{\figb}
\addrowfigure{\figc}
\addrowfigure{\figd}
\presentrowfigure
\\
\vspace{1em}\\
\rowfigurewidth{.8\textwidth}
\startrowfigure[\therowfigcount]{\fige}
\addrowfigure{\figf}
\addrowfigure{\figg}
\addrowfigure{\figh}
\presentrowfigure
\caption{These are my row figures}
\end{figure}

which came from these raw images:

\begin{figure}[ht]
\figa\figb\figc\figd
\\
\vspace{1em}\\
\fige\figf\figg\figh
\caption{These are the unaltered images}
\end{figure}
\end{document} 

在此处输入图片描述

显然,如果你想要做的不仅仅是在单个图像下方放置一个(子图编号),那么你必须将其传递给\startrowfig\addrowfig,存储它,并通过中的条目调用它\showrowfigure

相关内容