以下の内容はhttps://zrbabbler.hatenablog.com/entry/2025/08/08/230156より取得しました。


DVI文書のページ数を本質的に増やす話(scextenddvi)

猛暑……猛暑日……猛暑……酷暑……ゆきだるま!

というわけで、異常な気象や異常な世界情勢の中、今年も案の定ゆきだるまの日がやってきました!

しかし、この長引く世の中の異常はとうとうゆきだるまの日にも影響が及ぼし始めたようで、なんと当ブログの筆者の某ZR氏🙃が当日にネタを完成させられませんでした。どうやらこのことが☃️⛄️の不評を買ったらしくて、ツイッタァー(現𝕏)において🙃が埋められる事態に発展しているようです。

このままではクリスマス🎄を平和に迎えることにも支障が出てきそうです。仕方がないので、チョットしたネタを用意することにしました。

というわけで、本記事の内容は後日(11月)に大幅に加筆されています。予めご了承ください🙇

DVI文書のページを増やしたい話

TeXで文書を作る際に​「とにかくページを増やしたい」​という場合があります。

  • 課題のレポートについて「10ページ以上」という規定があるが、自分が書ける内容が3ページ分しかない。
  • 同人書籍の印刷を印刷所に依頼する際に「ページ数は4の倍数にする」という規定を守る必要がある。

単に「ページ数を増やせばよい」という話であれば白紙のページを増やすのが最も簡単な方法ですが、それが望ましくない場合もあります。例えば先述のレポートの事例では白紙ではなく何か内容のあるページが要求されるでしょう。同人書籍の場合は白紙でも差し支えないはずですが、それでも折角ページが増えるのであれば、少なくとも白紙よりかは何か内容があった方が望ましいのは確かでしょう。そして、ページに内容を配置するのであれば、その内容は非本質的なもの(🙃とか🦉とか)よりも本質的なもの(☃️とか⛄️とか)の方が望ましいことは言うまでもありません。

LaTeXで文書を作成している場合には☃️ページを増やすのは普通は難しいことではありません。

% upLaTeX+dvipdfmx
\RequirePackage{plautopatch}
\documentclass[uplatex,dvipdfmx,a4paper]{jsarticle}
%……(イロイロ)
\usepackage{scsnowman}% ゆきだるま☃
\newcommand*{\NicePage}{%
  \newpage
  \vspace*{\stretch{2}}
  \begin{center}
    \scsnowman[scale=60,muffler=red,hat,arms,buttons,snow]
  \end{center}
  \vspace*{\stretch{3}}
}
\begin{document}
%……(イロイロ)
おなかすいた。

% 素敵なページをいっぱい追加する(素敵😊)
\NicePage
\NicePage
\NicePage
\NicePage
\NicePage
\end{document}

このように画期的なscsnowmanパッケージを利用すれば簡単に☃️ページを好きなだけ増やせます。

しかし特殊な場合においては「scsnowmanパッケージが使えない」という可能性もあります。例えば「TikZと1相性の悪いパッケージを既に読み込んでいる」などの場合です。またscsnowmanパッケージはLaTeX専用であるため、LaTeX以外TeX(例えばplain TeX等)で文書を作成する場合にもscsnowmanが使えません。

TeXの側での改修ができない場合の対処方法として、TeXが出力するDVI形式やPDF形式のファイルを加工してページを増やすことが考えられます。この方法であればTeX文書に一切手を加えないためどんなTeX文書にも適用できるはずです。

DVI文書のページ(赤マフラー)を増やせる話

というわけで、DVIファイルに☃️ページを追加するソフトウェアをつくりました💪2

このソフトウェアはLua製で、LuaTeXのLuaモード(texlua)で起動できます。

texlua scextenddvi.lua «入力パス» «ページ数» «出力パス»

ここで«ページ数»には目標となるページ数を指定します。入力DVIファイルに対してこのページ数を満たすまで☃️ページが追加されたものが出力されます3

先程述べた「レポート(10ページ以上指定)を書いている状況」を想定してみましょう。とりあえず現状のレポートのLaTeXソースは以下のような感じです。

[report.tex]
% upLaTeX+dvipdfmx
\RequirePackage{plautopatch}
\documentclass[uplatex,dvipdfmx,a4paper]{jsarticle}
\usepackage{bxcoloremoji}
\title{メッチャやる気のあるレポート}
\author{オレオレ}
\date{提出期限:きのう}
\begin{document}
% タイトル
\maketitle

% メッチャやる気のある本文
おなかすいた\coloremoji{😟}

ねむすぎて草\coloremoji{😪}
\end{document}
>uplatex report.tex
This is e-upTeX, Version 3.141592653-p4.1.2-u2.00-250202-2.6 (utf8.uptex) (TeX Live 2025) (preloaded format=uplatex)
……(略)……
Output written on report.dvi (1 page, 1012 bytes).
Transcript written on report.log.

この通り、10ページ以上が必須であるのに現状は1ページしかなくてかなり危機的な状態です😥 ここでscextenddviの出番です。以下のコマンドを実行しましょう。

texlua scextenddvi.lua report.dvi 10 report-ex.dvi

元の1Kバイトしかない report.dvi の入力に対して37Kバイトの report-ex.dvi が出力されました。この出力のDVIファイルをいつも通りdvipdfmxで変換します。

>dvipdfmx report-ex.dvi
report-ex.dvi -> report-ex.pdf
[1][2][3][4][5][6][7][8][9][10]
22933 bytes written

おお、どうやら期待通りに10ページの文書ができているようです。早速開いてみましょう。

report.pdfの1ページ目(非素敵😐)

これは元の report.dvi の(ざんねん🙃な)ページですね。次のページを見てみましょう。

report.pdfの2ページ目(素敵😊)

本質的な内容が書けていてトッテモいい感じですね😊

DVI文書のページ(緑マフラー)をもっと増やせる話

scextenddviでは「ページ数が4の倍数になるように増やす」のような目標ページ数の設定もサポートしています。この場合は引数の«ページ数»4nと指定します。

5ページからなるLaTeX文書を用意します。

[book.tex]
% upLaTeX+dvipdfmx
\RequirePackage{plautopatch}
\documentclass[uplatex,dvipdfmx,book,paper=b5]{jlreq}
\usepackage{bxpapersize}
\begin{document}
1ページ\newpage
2ページ\newpage
3ページ\newpage
4ページ\newpage
5ページ\newpage
\end{document}
>uplatex book.tex
This is e-upTeX, Version 3.141592653-p4.1.2-u2.00-250202-2.6 (utf8.uptex) (TeX Live 2025) (preloaded format=uplatex)
……(略)……
Output written on book.dvi (5 pages, 940 bytes).
Transcript written on book.log.

この book.dvi のページ数を4の倍数になる(結果的に8ページになるはず)ように増やしてみます。先述の通り、引数に4nを指定します。ついでにマフラーの色も先程と変えてみましょう。--mufflerオプションでマフラーの色を指定できます。

texlua scextenddvi.lua --muffler=green book.dvi 4n book-ex.dvi

出力ファイル book-ex.dvi をdvipdfmxで変換します。

dvipdfmx book-ex.dvi
book-ex.dvi -> book-ex.pdf
[1][2][3][4][5][6][7][8]
9943 bytes written

ちゃんと8ページになっていますね🙂 6ページ目を見ると……

book.pdfの6ページ目(素敵😊)

ちゃんと緑マフラーになっていて素敵😊

補足事項

  • --mufflerオプションにはコンマ区切りで複数の色値を指定できます。新しいページを追加するごとに色値が順番に使われます(使い切ったら最初に戻る)。
  • --mufflerの色値はCSS Color Module Level 5の色値(<color>)の書式に従います。以下の値がサポートされます。
  • -Nというオプションを指定すると追加ページが非本質的(白紙)になってしまうので注意しましょう。
  • Latexmkの設定ファイル(.latexmk)において
    $dvi_filter = "texlua scextenddvi.lua %S «ページ数» %D";
    の行を記述するとビルドの過程でscextenddviが自動的に適用されます。

まとめ

来年こそは、ナントカの日ネタをナントカの日に出せるといいですね🙃


  1. scsnowmanパッケージはTikZに依存しています。
  2. PDF文書については賢明な読者への課題として残しておきましょう(えっ😲😲)
  3. 入力DVIファイルが既に目標ページ数以上の場合は入力と同じものがそのまま出力されます。
  4. Level 5の仕様の中で、named color(<named>)についてLevel 4の仕様書を参照しています。



以上の内容はhttps://zrbabbler.hatenablog.com/entry/2025/08/08/230156より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14