如何自動建立具有不同紙張尺寸的文件的多個版本並在產生的 PDF 檔案名稱中反映這一點?

如何自動建立具有不同紙張尺寸的文件的多個版本並在產生的 PDF 檔案名稱中反映這一點?

我正在使用該moderncv課程準備簡歷,以申請美國(標準紙張尺寸為letter)和英國(標準紙張尺寸為A4)的工作。

這是一個MWE名為main.tex.

% some preamble stuff before `documentclass` line
% blah blah (preamble)
% more blah blah (preamble)

\documentclass[11pt,a4paper,sans]{moderncv}  % <----- paper size is set here.

% a lot more preamble lines after `documentclass` line
\moderncvstyle{classic}
\usepackage{graphicx}

\firstname{John}
\familyname{Doe}

\address{83 Fancy Avenue}{Noweheresville}{Gotham City 24061} 
\phone[mobile]{123 456 7890}
\email{[email protected]}
\photo[64pt][0.5pt]{example-image-a}


\begin{document}
   \makecvtitle
\end{document}

如圖所示MWE,我的一些自訂序言位於該documentclass行之前,而其他一些則位於該行之後。

我正在使用latexmk來編譯文檔lualatex。我怎樣才能維持一個單身的 tex來源並自動建立 PDF 文件的兩個不同版本適當命名 Resume_A4paper.pdfResume_letterpaper.pdf?我很樂意使用任何directlua魔法和/或外部工具來促進這一點。

基本原理

根據目前的內容,我已手動檢查頁面佈局是否適合 A4/letter 尺寸。我只是想自動化這個過程,以便將來進行細微的調整(修改整個履歷中的一兩個要點以適應每個職位描述)。為我申請的每種類型的工作/行業手動生成 2 個不同的版本會很無聊。

答案1

在我的系統上,我將以下範例儲存為測試文件並在外殼上(透過chdircd其他方式)將活動目錄變更為所在目錄測試文件儲存起來,然後編譯測試文件透過致電乳膠從 shell/命令列 透過

Latexmk -cd -gg -pdflatex="lualatex --shell-escape %O %S" -pdf -dvi- -ps- test.tex

(也許在您的平台上您需要--enable-write18而不是--shell-escape

,然後在第一個期間盧拉泰克斯- 運行由乳膠,其中輔助文件一開始不存在,另一個乳膠-run 啟動,其中-jobname- 選項用於將短語附加-letterpaper到 的當前擴展\jobname

無論如何,都會檢查\jobname-primitive 的擴充功能是否包含短語-letterpaper

如果是這樣,選項「letterpaper」將傳遞給文件類別。

如果不是這樣,選項「a4paper」將傳遞給文件類別。

結果你就有了一個乳膠-運行測試文件恰好一次啟動另一個乳膠-運行測試文件-jobname="test-letterpaper"

最後你得到測試.pdf這是 a4 紙和測試信紙.pdf這是信紙。

如果您願意,您-jobname也可以在 shell/命令列上提供 - 選項,例如,執行

Latexmk -cd -gg -jobname="test-a4paper" -pdflatex="lualatex --shell-escape %O %S" -pdf -dvi- -ps- test.tex

(也許在您的平台上您需要--enable-write18而不是--shell-escape

為了得到測試-a4paper.pdf測試信紙.pdf

\makeatletter
\RequirePackage{shellesc}% more recent releases of LuaTeX don't provide
                         % \write18 any more. This package makes sure
                         % under such LuaTeX \write18 is emulated by
                         % calls to \directlua.
\newcommand\CheckWhetherNull[1]{%
  \if\relax\detokenize{#1}\relax
  \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}%
\newcommand\letterpaperphrase{-letterpaper}\@onelevel@sanitize\letterpaperphrase
\newcommand\Afourpaperphrase{-a4paper}\@onelevel@sanitize\Afourpaperphrase
%
\newcommand\gobbletoletterpaperphrase{}%
\expandafter\long\expandafter\def
\expandafter\gobbletoletterpaperphrase\expandafter#\expandafter1\letterpaperphrase{}%
%
\newcommand\gobbletoAfourpaperphrase{}%
\expandafter\long\expandafter\def
\expandafter\gobbletoAfourpaperphrase\expandafter#\expandafter1\Afourpaperphrase{}%
%
\newcommand\keepBeforeAfourpaperphrase{}%
\expandafter\long\expandafter\def
\expandafter\keepBeforeAfourpaperphrase
\expandafter#\expandafter1\Afourpaperphrase#2\relax{#1}%
%
\newcommand\CheckWhetherJobNameHasLetterpaperphrase{}%
\expandafter\def
\expandafter\CheckWhetherJobNameHasLetterpaperphrase
\expandafter{%
  \romannumeral0\expandafter\CheckWhetherNull\expandafter{%
     \romannumeral0\@firstofone{\expandafter\expandafter\expandafter} %
     \expandafter\gobbletoletterpaperphrase
     \romannumeral0\@firstofone{\expandafter\expandafter\expandafter} %
     \expandafter\jobname
     \letterpaperphrase
  }%
  { \@secondoftwo}%
  { \@firstoftwo}%
}%
\newcommand\CheckWhetherJobNameHasAfourpaperphrase{}%
\expandafter\def
\expandafter\CheckWhetherJobNameHasAfourpaperphrase
\expandafter{%
  \romannumeral0\expandafter\CheckWhetherNull\expandafter{%
     \romannumeral0\@firstofone{\expandafter\expandafter\expandafter} %
     \expandafter\gobbletoAfourpaperphrase
     \romannumeral0\@firstofone{\expandafter\expandafter\expandafter} %
     \expandafter\jobname
     \Afourpaperphrase
  }%
  { \@secondoftwo}%
  { \@firstoftwo}%
}%
\CheckWhetherJobNameHasLetterpaperphrase{%
  \PassOptionsToClass{letterpaper}{moderncv}%
}{%
  \PassOptionsToClass{a4paper}{moderncv}%
}%
\IfFileExists{\jobname.tex}{%
  \newcommand\myinfile{\jobname.tex}%
}{%
  \newcommand\myinfile{%
    \CheckWhetherJobNameHasAfourpaperphrase
      {\expandafter\keepBeforeAfourpaperphrase\jobname\relax}%
      {\jobname}.tex%
  }%
}%
\newcommand\createletterdocument{%
  \ShellEscape{%
    latexmk -cd
            -gg
            -jobname="\CheckWhetherJobNameHasAfourpaperphrase
                        {\expandafter\keepBeforeAfourpaperphrase\jobname\relax}%
                        {\jobname}%
                      \letterpaperphrase" 
            -pdflatex="lualatex \@percentchar O \@percentchar S" 
            -pdf -dvi- -ps- 
            \myinfile
  }%
}%
\AtBeginDocument{%
  \begingroup
  \immediate\write\@mainaux{\string\global\string\let\string\createletterdocument=\string\empty}%
  \endgroup
  \CheckWhetherJobNameHasLetterpaperphrase{}{\createletterdocument}%
}%
\makeatother

% some preamble stuff before `documentclass` line
% blah blah (preamble)
% more blah blah (preamble)

\documentclass[11pt,sans]{moderncv}  % <----- paper size is _not_ 
% set here but is set via \PassOptionsToClass.

\makeatletter
\@ifundefined{pdfpagewidth}{}{\pdfpagewidth=\paperwidth}%
\@ifundefined{pdfpageheight}{}{\pdfpageheight=\paperheight}%
\@ifundefined{pagewidth}{}{\pagewidth=\paperwidth}%
\@ifundefined{pageheight}{}{\pageheight=\paperheight}%
\makeatother

% a lot more preamble lines after `documentclass` line
\moderncvstyle{classic}
\usepackage{graphicx}

\firstname{John}
\familyname{Doe}

\address{83 Fancy Avenue}{Noweheresville}{Gotham City 24061} 
\phone[mobile]{123 456 7890}
\email{[email protected]}
\photo[64pt][0.5pt]{example-image-a}


\begin{document}
   \makecvtitle
\end{document}

相關內容