导入按标签而不是页码选择的 PDF 页面

导入按标签而不是页码选择的 PDF 页面

对于主文档中的每个图形,我都会导入.pdf包含所有图片的多页的相应页面(每页一张图片)。

有没有办法给每张图片贴上标签,以便通过提供标签而不是页码来导入图片?这意味着我想做类似的事情

\includegraphics[pagelabel={Figure name}]{pictures.pdf}

代替

\includegraphics[page=1]{pictures.pdf}

下面是生成带有(一些)图形的文件的代码:

\documentclass[multi=true,tikz,border={0pt  0pt 1cm 0pt}]{standalone}

\usepackage{amsmath,amssymb,amsrefs}
\usepackage{t1enc}%\usepackage[svgnames]{xcolor}
%\usepackage{tikz}
\usepackage{tcolorbox}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}

\newcommand{\x}{14cm}\newcommand{\y}{\x/2.5}
\newcommand{\all}{thick,width=\x,height=\y}
\newcommand{\size}{\small}
\begin{document}

\begin{tikzpicture}         %%% I would like to give a label \label{Figure name}
\begin{axis}[\all,ybar=-10pt,enlargelimits=0.05,ylabel={Volume},ymin=1,xlabel={Price},ymax=20,nodes near coords,nodes near coords align={vertical},xtick={2,3,4,5,6,7,8,9,10,11,12}]\size
\addplot[black,fill=blue] coordinates {(2,7) (3,8) (4, 15) (5, 10) (6,12)};
\addplot[black,fill=red] coordinates { (8, 18) (9, 12) (10,15) (11,5) (12,3)};
\legend{Buy orders, Sell orders}
\end{axis}
\end{tikzpicture}

\newpage

\begin{tikzpicture}
\begin{axis}[\all,ybar=-10pt,enlargelimits=0.05,ylabel={Volume},ymin=1,xlabel={Price},ymax=20,nodes near coords,nodes near coords align={vertical},xtick={2,3,4,5,6,7,8,9,10,11,12}]\size
\addplot[black,fill=blue] coordinates  {(2,7) (3,8) (4, 15) (5, 10) (6,12)};
\addplot[black,fill=red] coordinates  { (8, 8) (9, 12) (10,15) (11,5) (12,3)};
\addplot[black,fill=red, opacity=0.2] coordinates { (8, 18)};
\legend{Buy orders, Sell orders}
\end{axis}
\end{tikzpicture} \end{document}

答案1

figs.tex将带有图片标签的文件放入页面上,例如\label{fig:nameA}\label{fig:nameB}。然后在主文档中执行以下操作:

\documentclass{article}
\usepackage{graphicx,xr,refcount}
\externaldocument[A-]{figs}
\begin{document}
\includegraphics[page=\getpagerefnumber{A-fig:nameA}]{figs}
\includegraphics[page=\getpagerefnumber{A-fig:nameB}]{figs}
\end{document}

答案2

已编辑,完全允许通过参考标签打印图表。(已重新编辑,以更正\label指向关键点而不是图表编号的部分)

如果你愿意做一些不同的事情(IE(直接使用图形源文件,而不是通过 PDF 导入),这是一个使用包的图形(和表格)延迟机制的想法boxhandler。我假设您希望将图形用作图形浮点。

在详细介绍此解决方案之前,我应该泛泛地说一下boxhandler可以保存图形(图形和标题)而不打印它们(使用\holdFigures)。当它最终打印它们时,它希望按照创建它们的顺序进行打印(通过 )\nextFigure。因此,此解决方案的挑战在于欺骗boxhandler计数FigureClearedIndex以用户最终请求的顺序打印出存储的图像,而不是按照它们生成的顺序。

现在,开始解决问题。首先,将图形放在一个单独的文件中,例如这个(figs.tex),它可以是\input。请注意,我在 figs.tex 的顶部创建了命令\storethisfigure和,\showreffigure这些命令将用于创建和稍后通过引用调用图形(我必须使用 Heiko 的refcount包来完成此任务):

\usepackage{boxhandler}
\usepackage{refcount}
\newcounter{FigOutputCount}
\newcommand\showreffig[1]{%
  \setcounter{FigureClearedIndex}{\getrefnumber{KEY#1}}%
  \refstepcounter{FigOutputCount}\label{#1}%
  \addtocounter{FigureClearedIndex}{-1}%
  \nextFigure%
}
\newcounter{reffigcounter}
\newcommand\storethisfigure[3]{%
  \refstepcounter{reffigcounter}\label{KEY#1}%
  \bxfigure{#2}{#3}%
}
\holdFigures

\storethisfigure{fg:large}{large figure caption}{%
\scalebox{.9}{%
\begin{tikzpicture}         %%% I would like to give a label \label{Figure name}
\begin{axis}[\all,ybar=-10pt,enlargelimits=0.05,ylabel={Volume},ymin=1,xlabel={%
Price},ymax=20,nodes near coords,nodes near coords align={vertical},xtick={%
2,3,4,5,6,7,8,9,10,11,12}]\size
\addplot[black,fill=blue] coordinates {(2,7) (3,8) (4, 15) (5, 10) (6,12)};
\addplot[black,fill=red] coordinates { (8, 18) (9, 12) (10,15) (11,5) (12,3)};
\legend{Buy orders, Sell orders}
\end{axis}
\end{tikzpicture}
}
}

\storethisfigure{fg:small}{small figure caption}{%
\scalebox{.6}{%
\begin{tikzpicture}
\begin{axis}[\all,ybar=-10pt,enlargelimits=0.05,ylabel={Volume},ymin=1,xlabel={%
Price},ymax=20,nodes near coords,nodes near coords align={vertical},xtick={%
2,3,4,5,6,7,8,9,10,11,12}]\size
\addplot[black,fill=blue] coordinates  {(2,7) (3,8) (4, 15) (5, 10) (6,12)};
\addplot[black,fill=red] coordinates  { (8, 8) (9, 12) (10,15) (11,5) (12,3)};
\addplot[black,fill=red, opacity=0.2] coordinates { (8, 18)};
\legend{Buy orders, Sell orders}
\end{axis}
\end{tikzpicture}
}
}

figs.tex 文件\input位于主文档的序言中。然后,要按您想要的顺序调用图形,请使用\showreffig{label }。请注意,在此示例中,我首先调用文件中的第二个图像,然后调用第一个图像。

\documentclass{article}
\usepackage{amsmath,amssymb,amsrefs}
\usepackage{t1enc}%\usepackage[svgnames]{xcolor}
%\usepackage{tikz}
\usepackage{tcolorbox}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{lipsum}
\newcommand{\x}{14cm}\newcommand{\y}{\x/2.5}
\newcommand{\all}{thick,width=\x,height=\y}
\newcommand{\size}{\small}
\input{figs}
\begin{document}
\lipsum[4]
\showreffig{fg:small}
\lipsum[4]
\showreffig{fg:large}
In figure~\ref{fg:large}, we see the following.  But in 
figure~\ref{fg:small}...
\end{document}

结果如下:

在此处输入图片描述

另外一个好处是,该boxhandler软件包可以很好地控制标题的外观。

答案3

我添加了第二个答案,因为在另一个答案中,我展示了如何解决这个问题(通过 \ref标签创建图形),如果您愿意使用主文档重新编译图形。在这里,我制作了用户真正想要的东西,即从外部 PDF 文件加载图形,也通过\ref标签机制。

在这个解决方案(称为 FBR,即“figure-by-ref”)中,我还有一个仅包含实际图形数据的文件。它就是这个文件,名为 FBRfigs.tex,如下所示:

\storethisfigure{fg:eighteen}{18 peak sells}{%
\begin{tikzpicture}         %%% I would like to give a label \label{Figure name}
\begin{axis}[\all,ybar=-10pt,enlargelimits=0.05,ylabel={Volume},ymin=1,xlabel={Price},ymax=20,nodes near coords,nodes near coords align={vertical},xtick={2,3,4,5,6,7,8,9,10,11,12}]\size
\addplot[black,fill=blue] coordinates {(2,7) (3,8) (4, 15) (5, 10) (6,12)};
\addplot[black,fill=red] coordinates { (8, 18) (9, 12) (10,15) (11,5) (12,3)};
\legend{Buy orders, Sell orders}
\end{axis}
\end{tikzpicture}
}

\conditionalnewpage

\storethisfigure{fg:eight}{8 peak sells}{%
\begin{tikzpicture}
\begin{axis}[\all,ybar=-10pt,enlargelimits=0.05,ylabel={Volume},ymin=1,xlabel={Price},ymax=20,nodes near coords,nodes near coords align={vertical},xtick={2,3,4,5,6,7,8,9,10,11,12}]\size
\addplot[black,fill=blue] coordinates  {(2,7) (3,8) (4, 15) (5, 10) (6,12)};
\addplot[black,fill=red] coordinates  { (8, 8) (9, 12) (10,15) (11,5) (12,3)};
\addplot[black,fill=red, opacity=0.2] coordinates { (8, 18)};
\legend{Buy orders, Sell orders}
\end{axis}
\end{tikzpicture}
}

现在,要创建仅包含图像的所需 PDF 文件,我必须在这个数据文件周围放置一个包装器。我将包装器称为 FBRpdfs.tex,它看起来像这样。请注意,包装器使用用户在问题中提供的信息。

\documentclass[multi=true,tikz,border={0pt  0pt 1cm 0pt}]{standalone}

\usepackage{amsmath,amssymb,amsrefs}
\usepackage{t1enc}%\usepackage[svgnames]{xcolor}
%\usepackage{tikz}
\usepackage{tcolorbox}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\newcommand{\x}{12cm}\newcommand{\y}{\x/2.5}
\newcommand{\all}{thick,width=\x,height=\y}
\newcommand{\size}{\small}

\newcommand\storethisfigure[3]{#3}

\newcommand\conditionalnewpage{\newpage}

\begin{document}
\input{FBRfigs}
\end{document}

因此,pdflatex'ing FBRpdfs.tex 生成 FBRpdfs.pdf,包含两页上的两个图像(请注意,我现在将图像标识为“18”和“8”,因为\scalebox出于某种原因,我不能再使用独立类来缩小它们,就像我在其他解决方案中所做的那样)。

现在,对于如何通过引用访问这些图像的解决方案,我使用了与我之前发布的解决方案非常相似的逻辑。但是,我实际上没有使用不同的外部文件来存储引用信息,而是重新读取了 FBRfigs.tex 文件以获取引用标签信息,同时丢弃了该文件的实际图形内容!这意味着,我不需要所有的 tikz 内容等,也不需要重新编译图形。我只是使用该文件来获取标签信息,而且我实际上也保存了标题。然后,使用\includefig我定义的命令,我从文件中提取图形,并将重新读取的标题放在它下面,如下所示:

\documentclass{article}
\usepackage{lipsum}
\usepackage{boxhandler}
\usepackage{graphicx}
\usepackage{refcount}

\newcounter{FigureFileIndex}
\newcounter{FigOutputCount}
\newcounter{reffigcounter}

\newcommand\includefig[2][htbp]{%
  \setcounter{FigureFileIndex}{\getrefnumber{KEY#2}}%
  \refstepcounter{FigOutputCount}\label{#2}%
  \bxfigure[#1]{\csname figurecaption\roman{FigureFileIndex}\endcsname}%
    {\includegraphics[page=\value{FigureFileIndex}]{FBRpdfs.pdf}}%
}

%NOTE: NOTHING IS DONE BELOW WITH [EXPENSIVE] ARGUMENT #3
\newcommand\storethisfigure[3]{%
  \refstepcounter{reffigcounter}\label{KEY#1}%
  \expandafter\def\csname figurecaption\roman{reffigcounter}\endcsname{#2}%
}

\newcommand\conditionalnewpage{}

\input{FBRfigs}
\begin{document}
This is my introductory paragraph.

\includefig[ht]{fg:eight}
\lipsum[4]
\includefig[ht]{fg:eighteen}
In figure~\ref{fg:eighteen}, we see the following.  But in 
figure~\ref{fg:eight}...
\end{document}

在 FBR.tex 上执行 pdflatex(因为page=只有 pdflatex 能理解限定符)会产生以下内容:

在此处输入图片描述

我只注意到一件奇怪的事情。我相信它来自软件包refcount,也许有人已经知道这个问题了。它是这样的:如果编译失败(由于印刷错误等),那么所有重新编译都会失败,即使错误得到纠正并且 .aux 文件被删除。那么,让它工作的唯一方法是注释掉所有调用\includefig(这是refcount访问内容的地方),重新编译,然后取消\includefig注释调用,然后再次重新编译。这是一个很大的麻烦,但它不受我控制。我猜refcount保留了一些需要重置的 .aux 类文件(不在我的工作目录中)。我只是不知道。

相关内容