この記事は、TeX & LaTeX Advent Calendar 2012 の 第 11 日目 のために書いたものです。
12/10 の担当者は naoya_t さん で、12/12 の担当者は…どなたでしょう? 。
→ 12/12 の担当者は Nyoho さん です (「※初心者大歓迎。 いやマジで。」 という ZR さんの言葉を真に受けたのは、実際には私くらいだと思いますけど)。 [Added: Dec 13, 2012]
私は私立文系の万年初級ユーザーで、しかもプログラミングのプの字も知らない人間なので、他のみなさんのような、「TeX でプログラミング」 みたいなカッコイイお話は書けません。そこで、質よりも量で臨むことにして、初級ユーザー向けのトピックを 2 つ用意しました (と言っても、どちらも随分前に TeX Q & A で触れたことがあるものです.成長しないなぁ>自分)。あと、頑張って 「ネタ」 っぽいものも一つ考えてみました。
0. が一応ネタです。それから、I. が、classicthesis パッケージを例にして、複数の既存のパッケージをひとつのパッケージにまとめる初級的一方法の紹介で、そして、II. が、doc パッケージのコマンドインデックスを作る機能の解説です。
Since: December 10, 2012.
というわけで、まずはネタから:
という 2 つのファイルをダウンロードしていただいて、いずれも rename して末尾の “.txt” を取り除いてください (お手数をお掛けして恐縮ですが、dtx や ins という拡張子だと geocities にアップロード出来ず、別名でアップ後に拡張子を変更しようとしてもそれもダメだったので、仕方なく後ろに txt を付けました. zip にまとめたものも置いておきますので、rename が面倒な場合には こちら をダウンロードしてください)。
それで、ins ファイルのほうを、tex か latex で処理してください。出オチというか瞬間芸というか、ただ、それだけのものです。
dtx ファイルは、拡張子を dtx にしていますが、中にドキュメントは一切ありませんし、こちらをタイプセットしてしまいますと、ネタである Docstrip の log が上書きされてしまいますので、もしもタイプセットをされたい場合には、dtx ではなく、ins の結果出来る “Merry.TeXmas” というファイルのほうをタイプセットしてください。中味は dtx と同じものです。
dtx の中味自体は何でもよかったので、最初は単に “\LaTeXe
” を延々並べていたのですけれど、それもつまらないかと思って少し手を加えてみましたが、飽くまでネタは Docstrip の log のほうです (念のため私の手元で実行した場合の log も置いておきます.こういう log になる予定なのですが)。
ふぅ…。一応義務 (?!) を果たして人心地ついたので、以下、本論 (?) です。いずれも、初級らしさ満載の、泥臭いお話です。
必要なマクロを自分でスラスラと書いたりなど出来ない初級の身では、頼りになるのはパッケージですが、既存の複数のパッケージを組み合わせて、それを新たなパッケージとしているようなものがあります (なんか、他人の褌で…という感じがしないでもありませんが)。そういう例として、“classicthesis” というパッケージを挙げることが出来ます。
classicthesis は、listings, hyperref, xcolor, typearea, booktabs, soul, scrpage2, titlesec, tocloft, footmisc 等々といった代表的なパッケージを利用することで、Robert Bringhurst の “The Elements of Typographic Style” っぽい体裁を実現しようというものです (なお、W32TeX には classicthesis は入ってないようです.classicthesis が読み込んでいるパッケージについても、W32TeX には収録されていないものがいくつかあります)。
驚くべきことに、classicthesis 自体は、何も新たなマクロを定義したりはしていません (いえ、正確には、ほんのちょっとだけはしてます)。既存のパッケージを読み込んで、そのパッケージの設定をして、また次のパッケージを読み込んで、そのための設定をして…、を繰り返しているだけです。また、パッケージオプションの処理のために、中級以上の方なら滅多に使わないであろう ifthen パッケージを利用している点も、初級者フレンドリーです。これを参考にすると、\newif
とかを知らなくても、既存のクラスファイルと既存のパッケージを読み込んだ自分用のクラスファイルでもオプションを受け取れるようにも出来ます。
※ 既存のクラスファイルを下敷きにして自分用のクラスファイルを作る方法については、参照: Jim Hefferon, Minutes in Less Than Hours: Using LaTeX Resources
classictheisis の作者は、「I am tired of seeing so many ugly ones」 とか 「please do not break the beauty of the style by changing these things unless you really know what you are doing」 などとなかなか鼻息が荒いのですが、確かに “The Elements of Typographic Style” がキレイなのを認めるにはやぶさかではありませんが、classicthesis のほうはそれほどでもないようにも思います。ですから、ここで classicthesis を取り上げるのは、classicthesis の利用を薦めるためではなくて、初級的なパッケージの利用例を紹介することが目的です。
うんと単純化すると、classicthesis.sty の中味は、次のようになっています:
\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{classicthesis}[2012/08/12 v4.1 Typographic style for a classic-looking thesis] \RequirePackage{ifthen} \newboolean{@foo} \newboolean{@bar} \newboolean{@baz} ..... \newboolean{@zzz} % ******** % Options % ******** \DeclareOption{foo}{\setboolean{@foo}{true}} \DeclareOption{bar}{\setboolean{@bar}{true}} \DeclareOption{baz}{\setboolean{@baz}{true}} ..... \DeclareOption{zzz}{\setboolean{@zzz}{true}} \ProcessOptions\relax % packageZ-related stuff \ifthenelse{\boolean{@zzz}} {\@ifpackageloaded{packageZ} {\relax} {\RequirePackage{packageZ}} } {\relax} % ************** % For Package A % ************** \PassOptionsToPackage{options for pckgA}{packageA} \RequirePackage{packageA} \ifthenelse{\boolean{@foo}}{true-settings1}{false-settings1 (or \relax)} \ifthenelse{\boolean{@bar}}{true-settings2}{false-settings2 (or \relax)} % ************** % For Package B % ************** \PassOptionsToPackage{options for pckgB}{packageB} \RequirePackage{packageB} \ifthenelse{\boolean{@baz}}{true-settings3}{false-settings3 (or \relax)} \ifthenelse{\boolean{@qux}}{true-settings4}{false-settings4 (or \relax)} .....
(なんで \RequirePackage
のオプション引数を使わずにいちいち \PassOptionsToPackage
を使っているのかがちょっと謎ですが)
ここで例えば、
\usepackage[foo]{classicthesis}
とすると、スイッチ (フラグ) “@foo
” が true にセットされて、packageA 用の設定 “true-settings1
” を実行することが出来る、というわけです。“zzz
” というオプションの場合は、
\usepackage[zzz]{classicthesis}
とすると、ユーザーが classicthesis よりも前に既に packageZ を読み込んでいたら何もせず、読み込んでいなければ packageZ を読み込む、という指定になっています (“\@ifpackageloaded
” はユーザー用コマンドではないですけど、その名前から使い方は分かると思います)。
実際のコードについては、classicthesis.sty の中をご覧ください。TeX のプリミティブと LaTeX の内部コマンドで書かれている一般的なパッケージとは違って、classicthesis.sty はほぼ LaTeX のコマンドと各パッケージのユーザーコマンドのみで書かれていますので、初級でも十分理解出来ます (\ifthenelse
がネストしてたりしてちょっとゴチャゴチャはしてますけど)。
※ 逆に言うと、「TeX のプリミティブと LaTeX の内部コマンドで書かれている一般的なパッケージ」 の学習のためにはまったく役に立たないということですが…。
(なお、似たようなものに tufte-latex パッケージというのもあります.ただ、tufte のほうは、最初の頃は classicthesis と同じような単純なものでしたが、バージョンが上がるに連れだんだんと洗練されてきて複雑になってしまったので、中味を覗いて見るという点ではあまり初級向きではなくなってしまいました.)
ところで、いまどきのパッケージは、package.dtx, package.ins, package.pdf, readme というセットで配布されることが多いと思われますが、classicthesis には dtx ファイルがありません。普通は、package.dtx をタイプセットしたものが package.pdf ですが、classicthesis の場合には、本体の classicthesis.sty と、あと、ClassicThesis.pdf というタイプセット例とそのソースが同梱されています。そして、classicthesis.sty の中に、結構いろいろとコメントが書いてあります。
classicthesis.sty の中味を見るには、エディタでそのまま読んでもいいですしワープロで印刷することも出来ますし、また、せっかく LaTeX を使ってるのだからと頑張って listings パッケージを使ってカラフルにタイプセットしたりなんかも可能です。でもここで、doc パッケージを使いますと、コードをタイプセットできるだけでなく、コマンドインデックスを作ることが出来ます。
続いては、「doc パッケージを使うと、コマンドインデックスを作ることが出来て便利!」、という話をしようと思うのですが、その結論だけを書くなら、
\documentclass{article} \usepackage{doc} \EnableCrossrefs \CodelineIndex \begin{document} \IndexInput{classicthesis.sty} \PrintIndex \end{document}
で済むのですけれど、ここに至るまでの説明が以下、少々長くなります。
なぜ長くなったかと言いますと:
\IndexInput
で classicthesis.sty を読み込んでコマンドインデックスを作るためのもので、 “driver” と呼ばれます。当然この driver ファイルについての説明をしなければなりません。\EnableCrossrefs
, \CodelineIndex
, \IndexInput
, \PrintIndex
で充分なのですが、doc に則って書かれている dtx ファイルの場合には、\DisableCrossrefs
, \PageIndex
, \DocInput
; \RecordChanges
, \PrintChanges
なども使えるので、そのあたりも説明したほうがいいかな、とも思いました。という風に欲張ってしまったせいで、説明量が増えてしまいました。すいません。
というわけで、まずは、少し一般的な話から。
dtx ファイルを latex で処理するとドキュメント (ユーザーマニュアル+コードの説明) が取り出せて、ins ファイルを tex か latex で処理するとパッケージ (コードそのもの) が取り出せる、というのが普通ですよね。
dtx ファイルを書くのに使われているクラスファイルは ltxdoc.cls の場合が多いですが、ltxdoc の内部では doc パッケージが読み込まれています。また、ins ファイルの内部では、docstrip.tex が \input
されています。
つまり、doc パッケージが提供する枠組みに則って書かれているファイルを doc パッケージを使って処理すると、user manual + documented source code がタイプセット出来ます。また、Docstrip でファイルを処理すると、コメント行を取り去って code のみを取り出すことが出来るという仕組みになっています。
例として、いんちきな dtx ファイルを用意してみました (foobar.dtx.txt):
% \iffalse % % --- meta comments --- % % \fi % % \iffalse %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{foobar}[2012/12/11 v0.0 make me relax] % %<*driver> \ProvidesFile{foobar.drv}[2012/12/11 v0.0 sample dtx n driver] \documentclass{ltxdoc} \DoNotIndex{\def} \RecordChanges \EnableCrossrefs \CodelineIndex \GetFileInfo{foobar.drv} \begin{document} \DocInput{foobar.dtx} \PrintChanges \PrintIndex \end{document} %</driver> % \fi % % \CheckSum{3} % % \changes{v0.0}{2012/12/11}{sample dtx} % % \title{Package \textsf{Foobar}^^A % \thanks{This document corresponds to % \textsf{Foobar}~\fileversion, % dated \filedate.}} % \author{Creator of Foobar} % \date{\filedate} % \maketitle % \tableofcontents % % \section*{Introduction} % \addcontentsline{toc}{section}{Introduction} % % \section{User Manual} % % \textit{--- Description of user commands ---} % % \DescribeMacro{\usrcmd} % This control sequence is used to make me relax. % % \StopEventually{^^A % \begin{thebibliography}{1} % \bibitem{LLa94} % \textsc{Leslie Lamport}. % \newblock \textsc{\LaTeX: A Document Preparation System}. % \newblock Addison-Wesley, Reading, Massachusetts, 2nd edition, 1994. % \end{thebibliography} % } % % \section{Implementation} % % \textit{--- Description of the package's codes ---} % % \begin{macro}{\usrcmd} % \changes{v0.0}{2012/12/11}{the one and only macro} % \begin{macrocode} %<*package> \def\usrcmd{\relax} %</package> % \end{macrocode} % \end{macro} % % \Finale % \endinput
ここで、青字の部分がドキュメント (user manual + documented source code) で、赤字の部分がドキュメントをタイプセットして且つコマンドインデックスや変更履歴を作る指示をする部分です (“driver” と呼ばれます)。
※ < > で囲まれたタグは、Docstrip 用の指示です。Docstrip は原則として % で始まる行を取り去りますが、% の次にオプションのタグがあると、conditional に処理することが出来ます。例えば、Docstrip に “package” というオプションを指定すると、%<package> の行と、あと %<*package> と %</package> に挟まれた部分は残ります。逆に、“package” が指定されていないと、行頭に % がないにも関わらず、%<*package> と %</package> に挟まれた部分も取り去られます。この foobar.dtx の場合、行頭に % がなく且つタグにも挟まれていないコードは \endinput
だけなので、Docstrip に何もオプションを指定しないと、\endinput
しか残りません(!)。
この foobar.dtx を latex で処理する場合には、“%” で始まる行はコメントですし、\end{document}
で原稿は終わりとなりますので、latex には最初、赤字の部分しか見えません (上から順に処理していくので、実際には赤字の部分全体が一遍に見えるわけではないのですが)。
そして、\begin{document}
の次の行の \DocInput{foobar.dtx}
に到達すると、foobar.dtx 自身が読み込まれます (びっくり)。その際、“%” のカテゴリコードを一旦 9 (ignored character) にしてから foobar.dtx を読み込んで、その後でまた 14 (comment character) に戻しています。
そのため、\DocInput
で読み込まれた foobar.dtx では、“%” はコメントの印ではなく、かと言って印字もされない、無視される文字となります。また、\iffalse
と \fi
で挟まれた部分は 「常に偽」 ということで無視されるので、冒頭の “--- meta comments ---” の部分と、<package> から </driver> までの部分も無視されることになり、結局 \CheckSum
以下から最後の \endinput
までが \input
されたのと同じことになります。
それで、青字のドキュメント部分が、「普通に」 タイプセットされることになり、最後に \PrintChanges
と \PrintIndex
が実行された後、\end{document}
へと至ります。
※ 一般論としては \iffalse
と \fi
でコメントアウトするやり方は推奨されません。
※ “\NeedsTeXFormat{LaTeX2e}
” は \begin{document}
より後ろでは使えないので、<package> の行を無視させないと、エラーになります。
※ <*driver> </driver> で挟まれた部分を無視させないと “\documentclass{ltxdoc}
” がもう一度読み込まれることになり、やはりエラーとなります。
※ doc では “%” の代わりに、コメントの印としては、“^^A” が使えるようになっています。
※※ 実際にこの foobar.dtx から、変更履歴とコマンドインデックス付のドキュメントを得るには、以下のように処理します (なお、最近の W32TeX の場合には、オマケ に注意が必要かも知れません):
latex foobar.dtx
makeindex -s gind.ist foobar.idx
makeindex -s gglo.ist -o foobar.gls foobar.glo
latex foobar.dtx
makeindex -s gind.ist foobar.idx
makeindex -s gglo.ist -o foobar.gls foobar.glo
latex foobar.dtx
次に、上の foobar.dtx で使っているコマンドについて。
doc パッケージは、コードを説明するドキュメントを書くためのコマンド群と、コマンドインデックスを生成するためのコマンド群とを提供しています (いえ、他にもありますけどここでは割愛します)。
青字の部分でよく使われるコマンド:
赤字の部分でよく使われるコマンド:
パッケージを作ってドキュメントと共に配布したりするような方以外は青字の部分で使われるコマンドには用はないわけで、今回取り上げたいのも、コマンドインデックスの作成に関わる赤字の部分で使われるコマンドのほうです:
\OnlyDescription
が宣言されると、\StopEventually
まででドキュメントが終わりとなり、そこで \StopEventually
の引数が実行されます。デフォルトは \AlsoImplementation
で、その場合は、\StopEventually
よりも後ろまでタイプセットされて、\StopEventually
の引数は \Finale
で実行されます。\StopEventually
は、user manual と documented source code (= Implementation) との間に置かれます。\DisableCrossrefs
と \EnableCrossrefs
は、コマンドインデックスに拾うコマンドの範囲の指定です。デフォルトは \DisableCrossrefs
で、この場合は、\DescribeMacro{}
, \DescribeEnv{}
, \begin{macro}{}
, \begin{environment}{}
の引数のみが拾われます。 他方 \EnableCrossrefs
を宣言すると、\begin{macrocode}
と \end{macrocode}
の間のコマンドも拾われるので、この場合はつまり documented source code/implemantation の部分のコマンドも皆インデックスに載ります。\CodelineIndex
と \PageIndex
がインデックス項目を idx ファイルに書き出す指示です。\CodelineIndex
を宣言すると、コードに行番号が付いて、その行番号がインデックスに載ります (但し \DescribeMacro{}
, \DescribeEnv{}
の引数については、ページ番号です)。\PageIndex
のほうを宣言すると、コードの行番号は無しで、インデックスにはページ番号が載ります。\PageIndex
宣言時に \CodelineNumbered
も併せて宣言すれば、コードに行番号が付きます。\CodelineIndex
も \PageIndex
も宣言せずに、\CodelineNumbered
だけ指定すると、idx への書き出しはなしで、コードには行番号が付きます。\PrintIndex
です。\changes{}{}{}
による変更履歴を glo ファイルに書き出す指示が \RecordChanges
で、makeindex で処理した gls ファイルを読み込む指示が \PrintChanges
です。\DoNotIndex{}
には、コマンドインデックスに拾わなくていいコマンドのリストを指定します。カウンタ IndexColumns は、インデックスのコラム数です (デフォルトは 3)。\DocInput
で、それ以外のファイルを input する場合は \IndexInput
を使います。\IndexInput
で input されたファイルは、\begin{macrocode}
と \end{macrocode}
に挟まれたコードのように扱われて、“%” も印字されるので、ファイル全体がコメント行も含めて丸々タイプセットされます (上の foobar.dtx の例でも、\DocInput
を \IndexInput
に替えると、foobar.dtx 全体が verbatim にタイプセットされます)。以上から、dtx 以外のファイルについては、\IndexInput
で読み込んで、 \CodelineIndex
と \EnableCrossrefs
を宣言すれば、各行には行番号が付き、そして行番号が載ったコマンドインデックスも作れることが分かります。
で、これらのコマンドは赤字の driver の部分で使われるわけですが、最後に、ようやく driver の話です。
dtx ファイルの場合には、上の foobar.dtx で見ましたように冒頭に driver が組み込まれていますが、driver は単独のファイルとして作成することも出来ます。また、<*driver> </driver> で挟まれていますので、Docstrip に “driver” というオプションを与えると driver の部分のみを取り出すことも出来ます。
普通、dtx ファイルは冒頭にそれぞれの driver を含んでいて、その dtx ファイルのドキュメント部分で使われている独自のマクロの定義などもそこに書かれています。ここで、その driver がコマンドインデックスを作成するような指示になっていないようなときには、Docstrip で driver を取り出して、その driver ファイルに自分で必要な指示を書き加えてタイプセットするということも可能です。dtx ファイルに直接指示を書き足すのは多分 LPPL 上よろしくありません (driver ファイルを書き換える場合には driver のファイル名を rename すればいいわけですし、また、その dtx ファイルが ltxdoc.cls を使って書かれているならば、ltxdoc.cfg を使って指示を書き足すという手もあります → オマケ を参照)。
そして、dtx ではないファイルを verbatim にタイプセットして且つコマンドインデックスも作りたいという場合には、そのファイルを \IndexInput で読み込むような driver ファイルを作成すればいいわけです。
ようやくゴールに辿りつきました。冒頭の例にもう少し手を加えるとしますと、こんな感じでしょうか (リンクも欲しいので、doc パッケージの代わりに hypdoc パッケージを使いました):
\documentclass[a4paper,landscape,pdftex]{article} \usepackage[hmargin=3cm,vmargin={2.5cm,2cm}]{geometry} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{hypdoc} \DoNotIndex{\boolean,\DeclareOption,\ifthenelse,\setboolean} \DoNotIndex{\relax,\renewcommand,\RequirePackage} \EnableCrossrefs \CodelineIndex \setcounter{IndexColumns}{4} \pagestyle{headings} \markright{\normalfont\small \textit{Andr\'e Miede} \textsf{classicthesis.sty} \footnotesize\ttfamily\itshape v4.1 Typographic style for a classic-looking thesis} \begin{document} \title{\textsf{\huge classicthesis.sty}\\ \texttt{v4.1 Typographic style for a classic-looking thesis}} \author{Andr\'e Miede} \date{2012/08/12} \maketitle \IndexInput{classicthesis.sty} \PrintIndex \end{document}
このファイルの名前を仮に “doc_classicthesis.drv” としますと (拡張子は別に drv でなくてもいいのですが)、以下のように処理すると、コマンドインデックス付の pdf が出来ます (タイプセット例):
pdflatex doc_classicthesis.drv makeindex -s gind.ist doc_classicthesis.idx pdflatex doc_classicthesis.drv makeindex -s gind.ist doc_classicthesis.idx pdflatex doc_classicthesis.drv
なお、classicthesis.sty には \changes
が含まれていないですし、\IndexInput
をしているので変更履歴は作れませんが、dtx ファイル等を \DocInput
して変更履歴もタイプセットする場合には、\RecordChanges
と \PrintChanges
を指定した上で、
makeindex -s gglo.ist -o filename.gls filename.glo
を同じように途中で実行します。
dtx ファイルを書くのによく使われる ltxdoc.cls は、artcle.cls と doc.sty とで作られているクラスファイルで、その冒頭は次のようになっています:
\NeedsTeXFormat{LaTeX2e} \ProvidesClass{ltxdoc} [2007/11/11 v2.0u Standard LaTeX documentation class] \DeclareOption{a5paper}{\@latexerr{Option not supported}% {}} \DeclareOption*{% \PassOptionsToClass {\CurrentOption}{article}} \InputIfFileExists{ltxdoc.cfg} {\typeout{*************************************^^J% * Local config file ltxdoc.cfg used^^J% *************************************}} {} \ProcessOptions \LoadClass{article} \RequirePackage{doc} .....
\InputIfFileExists{ltxdoc.cfg}{}{}
という行があるので、TeX から見えるところに “ltxdoc.cfg” というファイルがあると、ここで読み込まれます。また、\LoadClass{article}
よりも前に読み込まれているので、ltxdoc.cfg の中で \PassOptionsToClass{}{article}
を使うと、article.cls にオプションを渡すことも出来ます。
※ もちろん、\RequirePackage{pckg}
よりも前であれば \PassOptionsToPackage{}{pckg}
を使って pckg にもオプションを渡せますが、doc パッケージの場合にはそもそも利用可能なオプションがありません。
ltxdoc.dtx に挙げられている ltxdoc.cfg の記述例から転記しますが、例えば、article.cls のデフォルトのペーパーサイズは letterpaper なので、それを a4paper に替えたい場合には、ltxdoc.cfg に、
\PassOptionsToClass{a4paper}{article}
と書いておけばよく、また、user manual しか必要なく、documented source code は要らないという場合には、
\AtBeginDocument{\OnlyDescription}
と書けばいいわけです (“\OnlyDescription
” は doc で提供されているコマンドのため、ltxdoc.cfg が読み込まれる時点では未定義なので、実行のタイミングを \AtBeginDocument
でズラします)。
そして、ltxdoc.cls で書かれた dtx ファイルの driver 部分にコマンドインデックス作成の指示がないようなときには、
\AtBeginDocument{\CodelineIndex\EnableCrossrefs} \AtEndDocument{\PrintIndex}
と ltxdoc.cfg に書いておけば、dtx ファイルや driver に手を加えることなしに、指示を書き足すことが出来ます。
また、hypdoc パッケージを使うと、リンクやしおりも作れてより便利なドキュメントになりますが、その場合には、例えば dvipdfmx を使って pdf にするなら、ltxdoc.cfg に、
\PassOptionsToPackage{dvipdfmx}{hyperref} \AtEndOfClass{\RequirePackage{hypdoc}}
と書けば、hypdoc.sty が最後に読み込まれますし、hypdoc の背後の hyperref に “dvipdfmx” というオプションも渡せます。
以上のように、ltxdoc.cfg ファイルは、個々のユーザーが必要に応じて作成するのが本来のはずです。
ところが。上掲のいんちき foobar.dtx を作るときに、一応テストのために実は (latex ではなく) pdflatex でタイプセットをしてみたのですが、いきなりリンクやしおりがついた pdf が出来てしまい、驚きました。それで log を見てみましたら、
************************************* * Local config file ltxdoc.cfg used ************************************* (c:/w32tex/share/texmf/source/latex/uri/ltxdoc.cfg File: ltxdoc.cfg 2011/03/04 v1.0a configuration file for uri (HMM) )
となってました。なんと、uri というパッケージに ltxdoc.cfg が含まれていて、その中に、
\PassOptionsToClass{a4paper}{article} \AtEndOfClass{% \RequirePackage[numbered]{hypdoc}[2010/03/26]% v1.9 \pdfstringdefDisableCommands{% \let\env\relax % longtable.dtx \let\mytt\relax % tabularx.dtx }% \addtolength{\topmargin}{-10mm}% \addtolength{\textheight}{20mm}% ...
等々が書かれていました。ありゃりゃ。
上の 「□ dtx ファイル一般の話とサンプル」 の最後のところで、「実際にこの foobar.dtx から、変更履歴とコマンドインデックス付のドキュメントを得るには、以下のように処理します」 として、latex で処理する例を挙げていますが、その場合でもこの uri パッケージの ltxdoc.cfg が読み込まれてしまいますので、知らない間に hypdoc 延いては hyperref が読み込まれてしまって、dvi ファイルにはいろんな special が入ってしまいます。これを避ける方法としては、 uri パッケージの ltxdoc.cfg を TeX から見えないようにするか、または作業しているフォルダ (や uri パッケージの ltxdoc.cfg よりも先にサーチされるフォルダ) に空の ltxdoc.cfg を置いておくくらいしか思いつきません。
この、uri パッケージに含まれる ltxdoc.cfg を予め uri.dtx から抽出してあるのが、手元の W32TeX [2012/08/30] だけなのか、それとも TeX Live とかでもそうなっているのかは確かめていませんけれど、これにはちょっとびっくりしました。
【追記】 qa: 56765 で、本田さんが W32TeX の showexpl パッケージについて、showexpl.cfg が最初から入っちゃってるということをご報告なさっていて、qa: 56766 で、角藤先生が対応してくださったと書かれているので、この件も、ご報告さえすれば割とすぐに改善されるのかも知れません。 [Added: Jan 20, 2013]
dtx ファイルのドキュメント部分は、大体、
% \iffalse % -- meta-comments -- % \fi % % -- description part (user manual) -- % % \StopEventually{} % % -- implementation part (documented source code) -- % % \Finale
という構造になっていて、driver で \OnlyDescription
が宣言されていると \StopEventually
までがタイプセットされ、\AlsoImplementation
だと最後の \Finale
までがタイプセットされるようになっています。
このように、description part と implementation part とを区切っているコマンドが “\StopEventually
” ですが、“stop eventually”ってなんか違和感ありますよね (eventually = after a long time, or after a lot of things have happened)。これは、doc パッケージの作者の Mittelbach さんがドイツ人で、ドイツ語の “eventuell” は英語の “possibly” とか “contingently” の意味なので、それをそのまま “eventually” としてしまわれたらしいです。
Last modified: Jan 20, 2013.