LaTeXで中綴じ冊子を作る際に自動でページ数を4の倍数にしたい
掲題通り、LaTeXで中綴じ冊子を作る際にページ数が4の倍数に自動でなるようにした備忘録です。
中綴じ冊子のページ数は、4の倍数と決まっています。1枚の紙を半分に折って表裏各右左の計4面をページとするためです。
LaTeXで冊子を書き、ページ数が4の倍数にならなかったら自動で穴埋めしたい。そのためにわざわざマクロを作成しました。結論これ↓です。
\documentclass{article}
\def\myMod#1#2{% {vModReturn = vModDivided % vModDivide}
\newcount\vModReturn
\newcount\vModDivided
\newcount\vModDivide
\newcount\vModTemp
\vModDivided=#1
\vModDivide =#2
\vModReturn=\vModDivided
\vModTemp =\vModDivided
\divide\vModTemp by \vModDivide
\multiply\vModTemp by \vModDivide
\advance\vModReturn by -\vModTemp
}
\def\myFilledpages#1#2{
\newcount\vFilledpagesReturn
\newcount\vFilledpagesRemainder
\newcount\vFilledpagesMod
\vFilledpagesRemainder=#1
\vFilledpagesMod =#2
\ifnum \vFilledpagesRemainder=0
\vFilledpagesReturn=0
\else
\advance\vFilledpagesMod by -\vFilledpagesRemainder
\vFilledpagesReturn = \vFilledpagesMod
\fi
}
\def\myFillpages#1{
\newcount\vFillpagesI % int I
\vFillpagesI=0 \loop\ifnum\vFillpagesI<#1 % for(I=0;I<#1;I++)
\clearpage % 全角スペースだけのページを挿入
\advance\vFillpagesI by1\repeat % end for
}
\begin{document}
\clearpage
\clearpage
\clearpage
\clearpage
\newcount\vCurrentpage
\vCurrentpage=\value{page}
myCurrentpageは、\number\vCurrentpage
\myMod{\vCurrentpage}{4}
vModReturnは、\number\vModReturn
\myFilledpages{\vModReturn}{4}
vfilledpagesReturnは、\number\vFilledpagesReturn
\myFillpages{\vFilledpagesReturn}
\end{document}
このtexファイルをコンパイルすると、本文の最後のコンテンツである「myCurrentpageは、…」という文言が5ページ目に来ます。そして、ページ数が4の倍数になるよう3ページ分空のページが挿入され、全体のページ数が8ページになります。
解説
命名規約について
LaTeXで宣言した識別子はグローバルになります。不用意に命名して名前被りが起きることは避けなければなりません。そのため、命名規約を定めました。
マクロ名 → "my{Macro: 頭大文字の文字列}"
マクロ内で使用する変数名 → "v{Macro: 頭大文字の文字列}{Var: 頭大文字の文字列}"
マクロの戻り値(後述) → "v{Macro: 頭大文字の文字列}Return"
戻り値について
マクロに戻り値が無いため、末尾に"Return"を付けた変数に値を代入することで、実質的な戻り値としています。
myModについて
やっていることは、除算の余りを返すだけです。
Pythonで言うところのこれです。
def myMod(vModDivided, vModDivide):
return vModDivided % vModDivide
下のページを参考にしています。
myFilledpagesについて
やっていることは、埋める必要のあるページ数の計算です。関数が使えないために、若干面倒なステップを踏んでいます。
Pythonで言うところのこれです。
def myFilledpages(vFilledpagesRemainder, vFilledpagesMod):
if vFilledpagesRemainder == 0:
return 0
else:
return vFilledpagesMod - vFilledpagesRemainder
myFillpagesについて
やっていることは、forループするだけです。
Pythonで言うところのこれです。
def myFillpages(n):
for _ in range(n):
clearpage()
下のページを参考にしています。
結論
追加ページが高々3枚なら手動でやった方が速い。
Cloud LaTeX上の環境で全て賄おうとすると面倒なことになります。
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!(140文字以内)