W32TeX の texinfotools-w32 に含まれている texinfo.tex (と texindex.exe) は、角藤先生が和文フォントも使えるように修正を加えてくださっているお蔭で、日本語で書かれている texi ファイルも普通に pTeX でタイプセット出来て、dvipdfmx で pdf も作れます。
でも、欧文のみの texi ファイルであれば、pdfTeX で処理すると、目次や索引からのリンクや、アウトライン (しおり) も出来ます。
本家の texinfo.tex と、XeTeX とか LuaTeX を使えば、trueroad さんの御尽力で日本語も使えるみたいなのですけれど、私の手元のシステムは古くて、また、XeTeX や LuaTeX も全然分かりません。
で、texinfo.tex の中味をパラパラと眺めてみましたら、XeTeX 用の設定が用意されているようなのですが、“@image support” という部分を別にすれば、格別 XeTeX 特有の設定というよりは、xdvipdfmx 用の special を発行するための設定のように見えます。また、「xdvipdfmx 用の special」 といっても (ちゃんと調べてはいませんが) dvipdfmx でも理解出来そうな基本的な special しか使われてないように見えます。
なので、XeTeX 用の設定が有効になるようにしつつ pTeX でタイプセットして、それを dvipdfmx で pdf にしたら、リンクやアウトラインが出来るんじゃないかな、と考えました。
適当に作った簡単な texi ファイルで試してみましたら、pTeX でも dvipdfmx でも特にエラーや警告も出ずに、リンクやしおりが付いた pdf が出来て、リンクからジャンプも出来ました (!)。しかし、自分で作ったものではない大部な texi ファイルを処理してみますと、dvipdfmx で警告が出ます。これが、XeTeX のふりをして pTeX で処理しているせいなのか、texi ファイルの書き方のせいなのかが、私には判断が出来ません。
というわけで、質問は、ざっくりしたお尋ねの仕方になってしまいますが、以下のようなやり方はまずいのでしょうか?、というものです:
(0) 前提
私の手元のシステムは W32TeX [2012/08/30] で、
pTeX 3.1415926-p3.3 (sjis) (TeX Live 2012/W32TeX)
This is dvipdfmx-20120420 by the DVIPDFMx project team,
modified for TeX Live,
an extended version of dvipdfm-0.13.2c developed by Mark A. Wicks.
です。
texinfo.tex は、2020-04-13 にダウンロードしてきた texinfotools-w32 の中のもので、
\def\texinfoversion{2020-02-11.09}
となっています。
(1) やってみたこと
XeTeX のふりをするには、〔W32TeX 版〕 texinfo.tex 内の以下の 3 箇所に対応すればよさそうに思えました (コメントは削ってあります):
a) \message{pdf,} の部分の 1154 行あたりの;
\ifx\XeTeXrevision\thisisundefined\else
\pdforxetextrue
\fi
b) \message{pdf,} の部分の 1562 行あたりの;
%
% For XeTeX
%
\ifx\XeTeXrevision\thisisundefined
\else
\ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1
\special{dvipdfmx:config C 0x0010}
\txiuseunicodedestnametrue
\else
\txiuseunicodedestnamefalse
\fi
c) \message{formatting,} の部分の 11349 行あたりの;
\def\internalpagesizes#1#2#3#4#5#6#7#8{%
\voffset = #3\relax
\topskip = #6\relax
\splittopskip = \topskip
%
\vsize = #1\relax
\advance\vsize by \topskip
\outervsize = \vsize
\advance\outervsize by 2\topandbottommargin
\txipageheight = \vsize
%
\hsize = #2\relax
\outerhsize = \hsize
\advance\outerhsize by 0.5in
\txipagewidth = \hsize
%
\normaloffset = #4\relax
\bindingoffset = #5\relax
%
\ifpdf
\pdfpageheight #7\relax
\pdfpagewidth #8\relax
\pdfhorigin = 1 true in
\pdfvorigin = 1 true in
\else
\ifx\XeTeXrevision\thisisundefined
\special{papersize=#8,#7}%
\else
\pdfpageheight #7\relax
\pdfpagewidth #8\relax
\fi
\fi
%
\setleading{\textleading}
%
\parindent = \defaultparindent
\setemergencystretch
}
a) と b) については、まず \XeTeXrevision を適当に定義しておいて、あと、b) の \ifnum が false になるように適当に \def\strcmp#1#2{-2} としてみました。
c) はデフォルトの \letterpaper の展開時に実行されますが、\XeTeXrevision を定義したせいで \special{papersize=#8,#7} でなくて \else のほうになってしまうので、予め \pdfpageheight と \pdfpagewidth を宣言しておいてやり過ごして、texinfo.cnf のほうで再定義してから、紙のサイズも改めて宣言することにしました。
これらの変更点を、forDvipdfmx.tex と texinfo.cnf にまとめました。
関連ファイルを zip に固めたものを添付します。
(2) dvipdfmx からの Warning の例
a) test.texi の元ネタである latex2e.texi ($Id: latex2e.texi 782 2020-04-03 23:00:48Z karl $) を pTeX でタイプセットしてから dvipdfmx で処理しますと、
latex2e.dvi -> latex2e.pdf
[1][2][3][4][5][6][7][8][9][10][11
** WARNING ** Could not find a name object.
** WARNING ** Could not find a key in dictionary object.
** WARNING ** Could not find a value in dictionary object.
** WARNING ** Ignoring invalid dictionary.
** WARNING ** Interpreting special command out (pdf:) failed.
** WARNING ** >> at page="11" position="(72, 769.89)" (in PDF)
** WARNING ** >> xxx "pdf:out [-] 2 << /Title (Backslash-space, \ ) /A << /S /Go
To..."
** WARNING ** >> Reading special command stopped around >> << /Title (Backslash-
space, \ ) /A << /S /GoTo /D (\(SPACE)...<<
][12]......[162
** WARNING ** Unknown PDF object type.
** WARNING ** No destination not specified for pdf:dest.
** WARNING ** Interpreting special command dest (pdf:) failed.
** WARNING ** >> at page="162" position="(72, 206.93)" (in PDF)
** WARNING ** >> xxx "pdf:dest (\(SPACE)) [@thispage /XYZ @xpos @ypos null]"
** WARNING ** >> Reading special command stopped around >>) [@thispage /XYZ @xpo
s @ypos null]<<
][163]......[245]
851668 bytes written
と言われます (一部省略)(画像の挿入は pTeX 実行時にスキップしています)。
b) 以前どこからかダウンロードしてきた emacs-lisp-intro-jp.texi という古いファイルがあったので、これで試してみますと、
emacs-lisp-intro-jp.dvi -> emacs-lisp-intro-jp.pdf
[1][2][3][4][5][6][7][8][9][10
** WARNING ** Object @1 already defined.
][11
** WARNING ** Object @2 already defined.
][12
** WARNING ** Object @3 already defined.
][13
** WARNING ** Object @4 already defined.
][14
** WARNING ** Object @5 already defined.
][15
** WARNING ** Object @6 already defined.
][16]......[212
** WARNING ** Empty bookmark node!
** WARNING ** You have tried to jump more than 1 level.
** WARNING ** Empty bookmark node!
** WARNING ** You have tried to jump more than 1 level.
** WARNING ** Empty bookmark node!
** WARNING ** You have tried to jump more than 1 level.
]
887976 bytes written
と言われました (でも、リンクやしおりは付いています)。
ありがとうございます。コマンドラインで
set TEX=eptex -kanji=sjis&texi2dvi --verbose yatexj.txi
dvipdfmx yatexj
とすると,添付の yatexj.pdf のようになるようにしました。
但し,残念ながら W32TeX を最新のものに更新する必要があります。
サポートする TeX エンジンは最新の eptex だけで,dvi ドライバは
dvipdfmx だけです。 新しい eptex のデフォルトのエンコーディングは
utf-8 であり,一方 texindex は Shift_JIS 専用なので,上のように
-kanji=sjis オプションが必須です。また当然日本語texinfo ソースは
Shift_JIS だけをサポートします。 texinfo.tex は,eptex を使用しない
場合は,オリジナルと同じ動作をするはずです。
まだ不具合があると思いますので,可能なら改善してゆきたいと思います。
set TEX=eptex -kanji=sjis&texi2dvi --verbose yatexj.txi
dvipdfmx yatexj
とすると,添付の yatexj.pdf のようになるようにしました。
但し,残念ながら W32TeX を最新のものに更新する必要があります。
サポートする TeX エンジンは最新の eptex だけで,dvi ドライバは
dvipdfmx だけです。 新しい eptex のデフォルトのエンコーディングは
utf-8 であり,一方 texindex は Shift_JIS 専用なので,上のように
-kanji=sjis オプションが必須です。また当然日本語texinfo ソースは
Shift_JIS だけをサポートします。 texinfo.tex は,eptex を使用しない
場合は,オリジナルと同じ動作をするはずです。
まだ不具合があると思いますので,可能なら改善してゆきたいと思います。
角藤先生、
> コマンドラインで
> set TEX=eptex -kanji=sjis&texi2dvi --verbose yatexj.txi
> dvipdfmx yatexj
> とすると,添付の yatexj.pdf のようになるようにしました。
とのこと、私のような者の単なる思い付きを早々に取り入れてくださり、ありがとうございます!
> 但し,残念ながら W32TeX を最新のものに更新する必要があります。
この機会に、すごく久しぶりにシステムを更新してみようかと思います。W32TeX については、もろもろいつも、本当にありがとうございます。
set TEX=eptex&texi2dvi --verbose latex2e.texi
dvipdfmx latex2e.dvi
の場合には添付の latex2e.pdf となりました。 eptex の場合は
include できる image は eps だけです。私が得た list.eps は
TeXDict begin
%%BeginPaperSize: Letter
/setpagedevice where
{ pop << /PageSize [612 792] >> setpagedevice }
{ /letter where { pop letter } if }
ifelse
%%EndPaperSize
end
があって,eps では無く,従って dvipdfmx が pdf に変換すると
0 0 612 792 になってしまうので,上記を除いて eps にしたもの
を include しました。
dvipdfmx のとき,warnings が出ますが,
set TEX=xetex -no-pdf&texi2dvi --verbose latex2e.texi
xdvipdfmx latex2e.xdv
でも同じ warnings が出ますので,許容範囲かと思います。
dvipdfmx latex2e.dvi
の場合には添付の latex2e.pdf となりました。 eptex の場合は
include できる image は eps だけです。私が得た list.eps は
TeXDict begin
%%BeginPaperSize: Letter
/setpagedevice where
{ pop << /PageSize [612 792] >> setpagedevice }
{ /letter where { pop letter } if }
ifelse
%%EndPaperSize
end
があって,eps では無く,従って dvipdfmx が pdf に変換すると
0 0 612 792 になってしまうので,上記を除いて eps にしたもの
を include しました。
dvipdfmx のとき,warnings が出ますが,
set TEX=xetex -no-pdf&texi2dvi --verbose latex2e.texi
xdvipdfmx latex2e.xdv
でも同じ warnings が出ますので,許容範囲かと思います。
角藤先生、続けてありがとうございます。
> dvipdfmx のとき,warnings が出ますが,
> set TEX=xetex -no-pdf&texi2dvi --verbose latex2e.texi
> xdvipdfmx latex2e.xdv
> でも同じ warnings が出ますので,許容範囲かと思います。
とのこと、承知いたしました。
ところで、添付してくださっている dvipdfmx による latex2e.pdf は、A4 判で 273 ページですが、私が最初に投稿した方法での pTeX --> dvipdfmx による latex2e.pdf は、A4 判で 245 ページです (但し、list の図は抜けています)。
https://latexref.xyz/dev/ にあがっている latex2e.pdf は pdfTeX によるもので letterpaper 判で 273 ページですが、私が手元で pdfTeX で A4 判でタイプセットしてみたものは 245 ページです。
添付してくださった dvipdfmx による latex2e.pdf のレイアウトが不自然なように見えるのは気のせいでしょうか…?
$Id: latex2e.texi 791 2020-04-15 17:20:43Z vincentb1
を letter size で eptex でタイプセットしたものです。
\input texinfo の次に
@special{papersize=612bp,792bp} を入れただけです。
(warnings は出ます)。
を letter size で eptex でタイプセットしたものです。
\input texinfo の次に
@special{papersize=612bp,792bp} を入れただけです。
(warnings は出ます)。
角藤先生
いくつもご返信をありがとうございます。応答迅速でなくすいません。
まず、
> 私の場合は,たまたま見つけた
> http://svn.gnu.org.ua/viewvc/latexrefman/trunk/
> のもの (Revision 790) で別物です。https://latexref.xyz/dev/
> ではありません。
> > 別物です
>
> たぶん Revision が違うだけで,同じ場所かも知れません。
の件ですが、私が試した latex2e.texi は、https://latexref.xyz/dev/ から辿った http://svn.gnu.org.ua/viewvc/latexrefman/trunk/ のものです。なので、おっしゃるとおり、同じ場所からで、Revision が違うだけのように思います。私の手元のものは恐らく Revision 782 です。
次に、
> 245 ページというのは,Index が入っていないのではありませんか?
> texinfo.tex 2020-02-11.09 の場合,私が配布している古い texindex
> が対応していないので,更新しないと Index が入りません。
とのことなので、慌てて確認してみましたが、Index は入っています。
> 2020年 04月 15日(水曜日) 22:45 - ut の投稿
に添付した zip 内の 01_dvipdfmx_latex2e.pdf と 02_pdftex_latex2e.pdf にも、Index は付いています (それで、A4 判で 245 ページ)。しかも、手元の古いシステムの texindex を使っているのですが、入っています!
最後に、
> pdftex の場合も 273 ページで,レイアウトも同じように見えます。
とのことですが、letterpaper 判で 273 ページというのは、私の手元でも、pTeX/dvipdfmx でも pdfTeX でも一緒です。そして、A4 判にすると、pTeX/dvipdfmx でも pdfTeX でも 245 ページになります (Index も付いてます)。ところが、
> 2020年 04月 15日(水曜日) 21:32 - Akira Kakuto の投稿
に添付してくださった latex2e.pdf は、eptex/dvipdfmx で A4 判で 273 ページになっています。また、レイアウトも、ページの下マージンがかなり広くなっているように見えます。
何か私が思い違いをしていなければと思うのですが…。
今ちょっと思ったのですが、
> \input texinfo の次に
> @special{papersize=612bp,792bp} を入れただけです。
とのことですが、そうしますと、もしかすると、
> 2020年 04月 15日(水曜日) 21:32 - Akira Kakuto の投稿
に添付してくださった latex2e.pdf の作成の際も、papersize special で直接サイズを A4 判にされたのでしょうか?
そうだとしますと、texinfo.tex でのデフォルトの \letterpaper で設定されている \textheight や \textwidth の値が有効なママになっているのではないでしょうか?
dvipdfmx の際に warnings が出るのは,outline などの
pdf strings に back slash (0x5c) があるのが原因である
ことがわかりました。実際 outline を見ると,0x5c がある
場合は,文字化けしています。pdftex と luatex の場合だけ,
\pdfescapestring というプリミティブが使えるので,
texinfo.tex で対応されています。他の場合は,何もせず,
そのまま出力されているので,warnings となるようです。
eptex の場合は,dvipdfmx にかける直前に
allow5c filename.dvi
というコマンドを実行すると,0x5c をエスケープし,
少なくとも latex2e.texi という例では warnings が出なくなり,
outline における文字化けもなくなりました。
pdf strings に back slash (0x5c) があるのが原因である
ことがわかりました。実際 outline を見ると,0x5c がある
場合は,文字化けしています。pdftex と luatex の場合だけ,
\pdfescapestring というプリミティブが使えるので,
texinfo.tex で対応されています。他の場合は,何もせず,
そのまま出力されているので,warnings となるようです。
eptex の場合は,dvipdfmx にかける直前に
allow5c filename.dvi
というコマンドを実行すると,0x5c をエスケープし,
少なくとも latex2e.texi という例では warnings が出なくなり,
outline における文字化けもなくなりました。
角藤先生
なんと、dvipdfmx の warning の原因を引き続きご調査くださっていたなんて、ありがとうございます!
> warnings が出るのは,outline などの
> pdf strings に back slash (0x5c) があるのが原因である
> ことがわかりました。
確かに、warning で、
** WARNING ** >> xxx "pdf:out [-] 2 << /Title (Backslash-space, \ ) /A << /S /Go
To..."
** WARNING ** >> Reading special command stopped around >> << /Title (Backslash-
space, \ ) /A << /S /GoTo /D (\(SPACE)...<<
と言われているのは見てはいたのですが、対処法がわかりませんでした。それで、どなたか pdf にお詳しい方とかから何か教えていただけないかな、と思って質問をさせていただいたのでした。
> pdftex と luatex の場合だけ,
> \pdfescapestring というプリミティブが使えるので,
> texinfo.tex で対応されています。他の場合は,何もせず,
> そのまま出力されているので,warnings となるようです。
確かに、texinfo.tex には、
%
% For LuaTeX
%
\def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}}
とか、
% #1 is a control sequence in which to do the replacements,
% which we \xdef.
\def\txiescapepdf#1{%
\ifx\pdfescapestring\thisisundefined
% No primitive available; should we give a warning or log?
% Many times it won't matter.
\xdef#1{#1}%
\else
% The expandable \pdfescapestring primitive escapes parentheses,
% backslashes, and other special chars.
\xdef#1{\pdfescapestring{#1}}%
\fi
}
という部分があって、pdfTeX の \pdfescapestring を使ったり、Lua でそれをエミュレートしたりしていたのですね…。
> eptex の場合は,dvipdfmx にかける直前に
> allow5c filename.dvi
> というコマンドを実行すると,0x5c をエスケープし,
> 少なくとも latex2e.texi という例では warnings が出なくなり,
> outline における文字化けもなくなりました。
今、ptex-w32 だけをもらってきて、先日 pTeX でタイプセットした手元の latex2e.dvi で試してみましたら、
>allow5c latex2e.dvi
Write 2019152 byte (245 page): latex2e.dvi
latex2e.dvi is now a new dvi.
Original dvi is saved as latex2e.dvi.bak.
>dvipdfmx latex2e.dvi
latex2e.dvi -> latex2e.pdf
[1][2][3][4][5][6][7][8][9][10][11
** WARNING ** Could not find a name object.
** WARNING ** Could not find a key in dictionary object.
** WARNING ** Could not find a value in dictionary object.
** WARNING ** Ignoring invalid dictionary.
** WARNING ** Interpreting special command out (pdf:) failed.
** WARNING ** >> at page="11" position="(72, 769.89)" (in PDF)
** WARNING ** >> xxx "pdf:out [-] 2 << /Title (Backslash-space, \ ) /A << /S /Go
To..."
** WARNING ** >> Reading special command stopped around >> << /Title (Backslash-
space, \ ) /A << /S /GoTo /D (\(SPACE)...<<
]......[12][162
** WARNING ** Unknown PDF object type.
** WARNING ** No destination not specified for pdf:dest.
** WARNING ** Interpreting special command dest (pdf:) failed.
** WARNING ** >> at page="162" position="(72, 206.93)" (in PDF)
** WARNING ** >> xxx "pdf:dest (\(SPACE)) [@thispage /XYZ @xpos @ypos null]"
** WARNING ** >> Reading special command stopped around >>) [@thispage /XYZ @xpo
s @ypos null]<<
][163]......[245]
851670 bytes written
となってしまいました。やはりちゃんと最新のシステムに更新しなければいけないのですね…。
いずれにしましても、本当に、ありがとうございます。
角藤先生!!!
> すぐ確かめられるように allow5c.zip
> を添付しておきます。
だなんて、重ねがさねありがとうございます!!!
で、早速やってみました:
>allow5c latex2e.dvi
Write 2019820 byte (245 page): latex2e.dvi
latex2e.dvi is now a new dvi.
Original dvi is saved as latex2e.dvi.bak.
>dvipdfmx latex2e.dvi
latex2e.dvi -> latex2e.pdf
[1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][
23][24][25][26][27][28][29][30][31][32][33][34][35][36][37][38][39][40][41][42][
43][44][45][46][47][48][49][50][51][52][53][54][55][56][57][58][59][60][61][62][
63][64][65][66][67][68][69][70][71][72][73][74][75][76][77][78][79][80][81][82][
83][84][85][86][87][88][89][90][91][92][93][94][95][96][97][98][99][100][101][10
2][103][104][105][106][107][108][109][110][111][112][113][114][115][116][117][11
8][119][120][121][122][123][124][125][126][127][128][129][130][131][132][133][13
4][135][136][137][138][139][140][141][142][143][144][145][146][147][148][149][15
0][151][152][153][154][155][156][157][158][159][160][161][162][163][164][165][16
6][167][168][169][170][171][172][173][174][175][176][177][178][179][180][181][18
2][183][184][185][186][187][188][189][190][191][192][193][194][195][196][197][19
8][199][200][201][202][203][204][205][206][207][208][209][210][211][212][213][21
4][215][216][217][218][219][220][221][222][223][224][225][226][227][228][229][23
0][231][232][233][234][235][236][237][238][239][240][241][242][243][244][245]
851701 bytes written
うまくいきました! もちろん、アウトラインの文字化けもありません!
本当に本当に、何とお礼を申し上げればよいのかも分からないのですが、兎にも角にも、心より御礼を申し上げます。本当に、ありがとうございます。
# チラシの裏にでも書いておけと言われそうな、蛇足の独り言です。
勉強のため、W32TeX [2020/04/13] と W32TeX [2020/04/18] の texinfotools-w32 の中の、texinfo.tex と yatexj.txi の差分をそれぞれ見てみました:
---------- diff: texinfo.tex ----------
C:\Users\ut\Desktop>diff texinfo.tex-0413 texinfo.tex-0418
73a74,75
> % We support eptex only (Apr. 15, 2020 --ak)
> % we support ptex also once again (Apr. 18, 2020 --ak)
82c84
< \message{ASCII-pTeX,}
---
> \message{pTeX or e-pTeX,}
84a87
> \special{pdf:tounicode 90ms-RKSJ-UCS2}
1145a1149,1152
> \ifpTeX
> \def\XeTeXrevision{\relax}
> \fi
>
1563a1571,1574
> \ifpTeX
> \special{dvipdfmx:config C 0x0010}
> \txiuseunicodedestnametrue
> \else
1586a1598
> \fi
8934c8946
<
---
> %
9529a9542,9544
> \ifpTeX
> \input epsf-dvipdfmx.tex
> \fi
9593a9609,9617
> \ifpTeX
> % For epsf.tex
> % \epsfbox itself resets \epsf?size at each figure.
> \setbox0 = \hbox{\ignorespaces #2}%
> \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
> \setbox0 = \hbox{\ignorespaces #3}%
> \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
> \epsfbox{#1.eps}%
> \else
9605a9630
> \fi
10084a10110
> \ifpTeX\else
10095a10122
> \fi
11369c11396
< \ifx\XeTeXrevision\thisisundefined
---
> \ifx\pdfpageheight\thisisundefined
---------- diff: yatexj.txi ----------
C:\Users\ut\Desktop>diff yatexj.txi-0413 yatexj.txi-0418
2c2,6
<
---
> @c a4 paper
> @afourpaper
> @c change urlcolor and linkcoloe to be blue
> @def@urlcolor{0 0 1}
> @def@linkcolor{0 0 1}
8c12
< @c @syncodeindex fn cp
---
> @syncodeindex fn cp
139a144,151
>
> @bigskip
> @centerline{eps イメージの例}
> @smallskip
> @centerline{
> @image{pic,14cm}
> }
> @bigskip
私の手元の dvipdfmx は古いので、今回修正された texinfo.tex をそのまま使うことは出来ないのですが、epsf-dvipdfmx.tex を導入したら、eps の挿入なんかも出来ました (!)。
最後に、重箱の隅をつつくようでおこがましいのですけれど、
yatexj.txi の 4 行目の:
> @c change urlcolor and linkcoloe to be blue
と、TEXINFOTOOLS-W32.txt の 77 行目の:
> 使って,dvipdfmx に書ける前に
は、typo かも知れません。