使用 cleverref 自动解决扩展问题,显示包含的 .pdf 文件的页面范围

使用 cleverref 自动解决扩展问题,显示包含的 .pdf 文件的页面范围

这是我尝试自动化解决方案使用 cleverref 显示包含的 .pdf 文件的页面范围。这似乎很有效,除非我传递给的文件名\AddLinkToFile包含在宏中。这似乎是 的两次使用带来的扩展问题\g@addto@macro

\expandafter这里需要什么魔法?

代码:

\documentclass{article}
\usepackage{xparse}
\usepackage{graphicx}
\usepackage{pdfpages}
\usepackage{xcolor}
\usepackage{lipsum}
\usepackage{xstring}
\usepackage{etoolbox}
%\usepackage{fancyhdr}
\usepackage[export]{adjustbox}% https://tex.stackexchange.com/questions/6073/scale-resize-large-images-graphics-that-exceed-page-margins

\usepackage[all,nodeanchor={south east}, color=magenta, opacity=1]{background}
\usepackage{hyperref}
\usepackage{cleveref}

%% Use background package to add actual page numbers in bottom right hand of margin
\newcommand{\FileNameToDisplayInMargin}{}
\SetBgContents{\tikz \node at (0,0) {Page \thepage\rotatebox{90}{\hspace*{2.0em}\ttfamily\FileNameToDisplayInMargin}};}
\SetBgPosition{current page.south east}
\SetBgHshift{-0.5em}
\SetBgVshift{0.5ex}
\SetBgAngle{0.0}% Select rotation 
\SetBgScale{1.5}% Select scale factor


\makeatletter
\newcommand*{\NotePage}[1]{%
    \hfill\tikz[overlay] \path ++(1.0cm,0) node[anchor=west, color=red] {#1};%
}

\newcommand{\@ListOfIncludes}{\pagestyle{empty}}% Build list of files to include
\AtEndDocument{\@ListOfIncludes}%
\NewDocumentCommand{\AddLinkToFile}{%
    m% #1 = text to display 
    m% #2 = file to open upon clicking 
}{%
    \edef\ExpandedFileName{#2}%
    \par
    \IfFileExists{"#2"}{%
        File: \href{run:\ExpandedFileName}{\textcolor{blue}{#1}}%
        \IfEndWith{#2}{.pdf}{% .pdf files has a page range
            %% https://tex.stackexchange.com/questions/198091/get-number-of-pages-of-external-pdf
            \pdfximage{#2}% 
            \edef\LastPage{\the\pdflastximagepages}%
            \ifnum\LastPage=1
                \NotePage{\Cpageref{#2 1}}% Only a single page in this .pdf
            \else
                %% Page range is page "1" to \LastPage of this .pdf
                \NotePage{\Cpagerefrange{#2 1}{#2 \LastPage}}%
            \fi
            %% Add to list so that this file is included in this document
            \g@addto@macro\@ListOfIncludes{\IncludePdfFile{#2}}%
        }{% non .pdf files are only a single page.
            \NotePage{\Cpageref{#2}}%
            %% Add to list so that this file is included in this document
            \g@addto@macro\@ListOfIncludes{\IncludeImageFile{#2}}%
        }%
    }{%
        File: \href{run:\ExpandedFileName}{\textcolor{orange}{#1}}%
        \typeout{**** Warning: Failed to link file "\ExpandedFileName".}%
    }%
    %%\show\@ListOfIncludes
}%
\makeatother

\newcounter{CurrentPageNumber}
\newcommand*{\LabelThisPage}[1]{%
    % #1 = label prefix 
    \thispagestyle{empty}%
    \stepcounter{CurrentPageNumber}%
    \phantomsection%
    \label{#1 \arabic{CurrentPageNumber}}%
}%

\newcommand*{\IncludePdfFile}[1]{%
    % #1 = .pdf file name (with path)
    \edef\ExpandedFileName{#1}%
    \ifcsdef{\ExpandedFileName Previously Linked}{}{%
        \newpage%
        \setcounter{CurrentPageNumber}{0}%
        \edef\FileNameToDisplayInMargin{File = \ExpandedFileName}%
        \includepdf[pagecommand={\LabelThisPage{#1}}, pages=1-last]{\ExpandedFileName}%
        \csdef{\ExpandedFileName Previously Linked}{}% No need to re-include this file
    }%
}%
\newcommand*{\IncludeImageFile}[1]{%
    % #1 = image file name (with path)  non .pdf)
    %% For non .pdf file we can place multiple images per page, so no \newpage here
    \phantomsection%
    \label{#1}%
    \def\FileNameToDisplayInMargin{File = #1}%
    \noindent\includegraphics[max width=\linewidth,keepaspectratio=true]{#1}%
}%


\begin{document}

%%% This does not:
%\def\FileName{kant.pdf}
%\AddLinkToFile{Kant 1}{\FileName}
%\def\FileName{lipsum1.pdf}
%\AddLinkToFile{Lipsum Single Page}{\FileName}
%\def\FileName{../images/EiffelWide.jpg}
%\AddLinkToFile{Eiffel 1}{\FileName}
%\def\FileName{lipsum.pdf}
%\AddLinkToFile{Lipsum}{\FileName}
%\def\FileName{kant.pdf}
%\AddLinkToFile{Kant 1 Duplicate Link}{kant.pdf}%
%\def\FileName{}


%% This works:
\AddLinkToFile{Kant 1}{kant.pdf}
\AddLinkToFile{Lipsum Single Page}{lipsum1.pdf}
\AddLinkToFile{Eiffel 1}{../images/EiffelWide.jpg}
\AddLinkToFile{Lipsum}{lipsum.pdf}
\AddLinkToFile{Kant 1 Duplicate Link}{kant.pdf}%
\end{document}

答案1

我想说的是

\begingroup\edef\x{\endgroup
  \noexpand\g@addto@macro\noexpand\@ListOfIncludes{\noexpand\IncludePdfFile{#2}}%
}\x

应该管用。

更容易etoolbox

\xappto\@ListOfIncludes{\noexpand\IncludePdfFile{#2}}

相关内容