YaTeX の気になる所

YaTeX の気になる所をフィードバック.

YaTeX は状況判断をしながら必要な補完を行う.他のエディタでのTeX入力支援は予め用意された文字列を挿入するくらいで,YaTeX のように動作するものはめずらしい(あるかな?).この賢さが YaTeX の特徴.
ここでは自分が毎日使っていて気になるところをフィードバックする.

hgreposログ

理解が不十分なまま書いている事もあるので,間違いに気付いたらすぐに編集・削除する。

タイプセットの自動 Rerun 機能について(1.76以降)

数式番号などの参照 \ref{...} を追加した後はタイプセッタ(latex)を2回実行する必要があり、文献引用の \cite{...} を追加した後は latexbibtexlatexlatex という順序で実行する必要がある。

これらを自動で行ってくれる Perl スクリプト latexmk がある。YaTeX は 1.76 からこれに相当する機能をデフォルトで提供することになりそうだ。

■ 開発は以下のような経過を辿って、現在 (3) の状態にある。

  • (1) タイプセッタのログ("LaTeX Warning: There were undefined references" など?)を見て、もう一度タイプセッタを実行する auto-rerun が実装された。(\label \ref の対応はこれで解消できる。\tableofcontentsには未対応。)
  • (2) 文献引用(\cite{...})や索引(\index) にも対応した。これらはタイプセッタのログを見て判定していることから、\cite を追加した再には正しく判定できるが、削除した後の不整合を判定できなかった。
  • (3) cite 削除の後の判定には aux ファイルの解析など余計な処理が必要になるのでこの方向での解決は目指さず、『結局、「bibtexを使う文書の場合は問答無用で最初に platex+bibtex」としました。』という別のアプローチに変更された。(mendex の自動判定が出来なくなった!?)

(2) の問題点は、ユーザーからすると bibtex コマンドを自分で実行する必要がない「全自動タイプセット機能」に見えるため、bibtex を手動で実行しなくてよいと思える。しかし、cite を削除した後の不整合は、何度タイプセットを繰り返しても解消しないので、文献リストと本文の番号が一致しないまま印刷してしまうというミスが起こりうる。

(3) は、文を更新のみでも毎回 latex + bibtex + latex と2回 LaTeX が実行される事になる。普段から latex (pdflatex)の処理時間が0.1秒でも短くなってほしいと思っていた(編集作業をリアルタイムプレビューに近づけたい)自分としては受け入れ難い仕様だ。(LaTeX に必要な処理時間は書類による。)

いずれの仕様も、自動判定のところはタイプセットログを解析するだけなので、目次(\tableofcontents)を作る時に必要な2回処理が判定できない(?)

■ 問題点ばかり指摘しても建設的ではないので、自分なりに1つ代案を考えた。以下で LaTeX は (p)latex か pdflatex コマンドの実行。

  • "LaTeX 自動 rerun": rerun 機能は LaTeX 処理だけに限定する。(ref/label や \tableofcontents のために必要な2回目の LaTeX 処理を自動で判断して行う)
  • "bibtex 一括実行": bibtex(pbibtex) の実行はこれまで通りユーザーからの命令で実行する。ただし、bibtex 実行(C-c C-t b) では、必要な処理を一括で行う。つまり「LaTeXbibtexLaTeXLaTeX」を行う。
  • "makeindex 一括実行": makeindex(mendex) の実行はこれまで通りユーザーからの命令で実行する。ただし、makeindex 実行(C-c C-t i) では、必要な処理を一括で行う。つまり「LaTeX→makeindex→LaTeX」を行う
  • "pdfdviモード" PDFプレビュアを利用している場合は上の3つの処理の最後に dvipdfm(x) を実行する。

bibtex の実行が面倒だったのは、bibtex を1回実行する前後にLaTeXを合計3回正しい順序で実行する必要があった事だ。いつ実行する必要があるかというタイミングはユーザーはだいたい分かっている事なので、その部分を自動判定にしなくても良い。

以下、補足。

  • latexmk との棲み分け:全自動タイプセット環境を実現したい人は latexmk を使うように誘導。半手動だけど、自動判定のための処理が少なく、最短時間で結果を出力してくれる機能を YaTeX として提供する。
  • pdflatex を利用している場合:、 "bibtex一括実行"の最初の2回のpdflatex呼び出しは「draftmode」オプションをつける。そうすると不用なPDFファイルを生成せず処理時間が短くなる。
  • bibtex(pbibtex) や makeindex(mendex) は本来 LaTeX とは独立のプログラムなので、完全な自動実行機能を提供しない場合は、独立したコマンドにしておく事でユーザーの誤解などによるトラブルを防げる。
  • "LaTeX 自動 rerun" は \tableofcontents も自動判定してほしいところだが、タイプセットログに警告がでないみたいなので、.aux ファイルの更新を md5 (Windows では FCIV?)で見る必要があるかもしれない。

アイデアをシェルスクリプトにしてみた。

array 環境、tabular 環境などで挿入されるテンプレートに「\\」は必要か?

\begin{array}[t]{ccc}
 & & \\
\end{array}

「\\」はターミネータではなくデリミタでは?
ML: [yatex:04679], [yatex:04680], [yatex:04682]

ref補完で種類を問い合わせる

ref 補完の時に eq/fig/tab/sec/enumerate などを聞けば良いと思う.数式がたくさんある原稿で,種類毎に参照先を拾ってくる機能は実用的.(図などは比較的近くで参照するけど、セクションを参照する場合は遠い。)
(追記:refのストローク数を最小限にするために実装しないと返答を頂いた.ストローク数を優先することは理解できる.でも種類毎に拾ってくる機能は既に実装されていて,figref や tabref のみでしか呼び出せないのは勿体ない気がする.)

  • figref 補完の時に figure 環境の中にある label を拾ってくれるけど、figure*環境の label は拾ってくれない。(figure*環境はスタイルファイルに依存するかも知れないけど、fig環境にカスタマイズで追加できるだろうか?)
  • \figref{hoge} から \label{hoge} へのジャンプ C-c C-g が出来なかった。

ref 補完で subsection などを拾わなくてよいか?(2012-1-31:追記)

デフォルトの状態では section しか集めてこないけど,subsection や sub subsection を参照することはよくある。以下のように設定すれば良いのだけど,最初からできるようにしてもよいのでは?

(setq YaTeX::ref-labeling-section-level 3)

括弧サイズの調節(保留)

YaTeX は括弧のサイズを変更する \biggl \biggr など l と r が付いたものを知っているけど,l や r のない\bigg などの命令もある参考
\left \right という括弧を自動でサイズ調節する命令は,後者の拡張のような振る舞いをする.

  • 1.76リリース以降にサポートが必要かどうかを吟味する

amsmath パッケージのコマンド(保留)

amsmath パッケージを使うと,cdots の代わりに dotsc, dotsb などが用意されているけどYaTeX は覚えていない.amsmath パッケージの利用は,標準だと思うので,AMSLaTeXに対応するなら網羅したほうが良いけど,作業量が多くなりチェックも大変なので 1.76 リリースではできないとおもう.amsmathについて徹底したほうが良いと思ったのは,YaTeX を使えば LaTeX の正しい使い方ができるということを実現するため.(でも線引きは難しい.dotsc などを使っている人は少ないかも.)

  • 1.76リリース以降にサポートが必要かどうかを吟味する

text{} の引数の中が数式モード

数式環境の中でテキストを入力するのは text{} で,この中では数式モードではなくテキストモードと判定されている必要がある.その中で $...$ で数式を入れることもある.

親ファイルを見つける.返答を頂いたけどまだ考え中

  • ファイルを分割して input/include していて,その子ファイル編集時にタイプセットをすると,親ファイルが何かを聞かれる.この時にリターンを押してしまうと,そのファイルがプリアンブルを含んでいると解釈され,yatex-modeを立ち上げ直すなどしないと親ファイルの再指定ができない.
  • ディレクトリ内の*.texファイルを検索してプリアンブルとinput/includeを含んでいるファイルを自動で見つけてもよいかもしれない.
  • 手動選択の時も候補は拡張子 tex に限定できる.(追記:2012-2-3)

YaTeX-indent-line が使い難い(課題)

section,subsection と階層ごとに深くなるけど,TeXの場合はインデントで階層構造を見せなくても良いと思う.YaTeX以外のエディタで,テキストが行頭から始まらないものはあまりない.

個人的にはlatex-indent.elを使っていてその動作に満足している.

広瀬さんに以下のように説明して頂いたが,解決策がないか考える.でも1.76リリース以降の課題.

このインデントは M-x YaTeX-section-overview
(または [prefix] s C-v)
で使われます。使いまわし原稿のセクション階層を1ずらしたりするのに
使うのである意味必須です(Sectioning バッファの u d U D)。


タイプセットの 1 or 2 ストロークキーバインド

C-c C-t のように,複数の操作にアクセスするメニュー的なUIはもちろん便利だけど,TeXの編集作業の中でタイプセットを実行する回数は頻繁.毎回プレビューを丁寧に見なくても,新しく追加した部分に間違いがないかということを確認することにもなり,作業時間が短くなる.(PDFビュアーは背面にあるまま自動で更新してくれるものもある.)
既に他が割り当てられているけど「C-c C-c」をタイプセットの呼び出しにするのが1つの候補.(Macなら⌘キーによるショートカットが空いているので1ストロークのものを好きに定義できるけど.)

数式環境のbeginの前の \ の色(保留)

Font-Lock による色付けで,数式環境(equation, alignなど)の場合だけ,\begin の \ だけ色が違う.(color-themeを利用している)

害はないので直さない.

cite{} 補完でのリスト作成(保留)

文献データベースを作ってそのbibファイルを読み込んでいる場合にcite{}補完をすると毎回リストを作成し時間がかかる.文献数が数百とか数千というのは珍しくない.
文献管理ソフトで bib ファイルを作っている人は,おそらく YaTeX のciteコマンド補完を使わずに入力している(参考(youtube))だろうから,急いで実装する必要はない.

ミニバッファからの引数入力は便利か? 追記:2012-1-30

デフォルトのまま YaTeX を使うと section型の補完による引数はミニバッファから聞かれる.変数 YaTeX-skip-default-reader を t にすればよいけど,デフォルトでは nil だ.この入力方法は本当に必要だろうか?引数がただの数字や単語だけならいい.例えば\section{}の場合,引数は複数の単語を入力する.英語ならスペルチェックを利用しながら書きたいかもしれない.ミニバッファの中だと ispell もちゃんと動作しない.数式環境の \sqrt{} や \frac{}{} も引数の中で数学記号
イメージ補完やギリシャ文字補完による入力が必要なものもある.このように LaTeX の多くのコマンドが取る引数はミニバッファではなく普通の入力の方がよいものだ.
提案としては,デフォルトから YaTeX-skip-default-reader を t にするか,場合分け(引数が一覧リストの中から選べる場合や\tilde{x}のように文字を修飾するコマンドの場合はミニバッファから,そうでない場合はすぐに \hoge{|} を挿入)するのが良いと思う.

TeXの要らないファイルを削除する機能 追記:2012-2-3

時々トラブルで aux ファイルを消す必要がある.このような LaTeX が作るファイル aux や log ファイルを一括で削除する clean 機能があると便利かもしれない.(latexmk -c に相当する機能)

textcolor 補完 追記:2012-2-4

pdflatex を使っている場合,textcolor コマンドを補完入力すると `named' color を使うか聞かれるが,それに従って \textcolor[named]{Blue}{yatex} と入力するとエラーがでる.

`named' color とは dvips によって定義されている68種類の色で,それらを使うには pdflatex 等でも使うには以下のように書けば良いらしい.(xcolorパッケージの使い方だと思っていたけど color パッケージでもできた.もう少し勉強する必要がある.)

\documentclass{article}
\usepackage[usenames,dvipsnames]{color}
\begin{document}
\textcolor{Aquamarine}{\LaTeX}
\end{document}

includegraphics での [prefix] C-g の動作 追記:2012-2-8

サイズ指定などがあると EPSファイルをうまく開けなかった.またPDFファイルの場合も正しく動作しないようだ.(山本さん@munepixyz からOSXWSのMLで教えて頂いた.)