2019年6月10日月曜日

array環境と角括弧(ブラケット)

 もうarrayは行列の中に線を引くとか例外的なときにだけ使い、基本 matrix (amsmathパッケージ)にしたい、という話。

 行列の記述方法としての是非はちょっと置いておくとして、例えばこんな行列を組版しようとしました。  ところがこれはエラーになり、組版できません。  面白い? ことに、これはエラーになりません。  2 行目以降の 1 列目の要素、が、[ で始まっている場合、 エラーとなるようです。なにかのオプション記述と勘違いしているのでしょうか。

 対処方法は、\hspace*{0pt}[0] のように、 ゼロ幅スペースや空白文字を頭に置く、か、 \left[ 0 \right] などとすることです。
大きくならないことが分かっているのに \left[ - \right]を書くのもなあ、と思っちゃいますね。空白文字なら ~ で1文字ですが当然謎の空間が生まれてしまいます。\hspace*{0pt}もちょい長いですね。複数行あったとき投げ出したくなるでしょう。

 ちなみに amsmath パッケージの matrix 系の環境を使えば、これだけで済みます。
とても、楽。

 array環境は行列の中に縦横線を引くときにだけ使い、基本的には amsmath の matrix 系で済ませていいと思います。

余談:もしかしてtabularもダメかな? と思って試してみたらやっぱりダメでした。 ゼロ幅スペースを入れてエラーを回避していますが、お試しの際は \hspace*{0mm}を省いてみてください。 array のときと同様に、 Missing number, treated as zero.などと、 何かのオプションと勘違いしたエラーを出してきます。

2019年5月28日火曜日

エディタから latexmk を使うと何故か pdflatex を呼び出される

去年ほぼ同じ内容をまとめていたので要約

Q: エディタの拡張機能とかで latexmk を使ってコンパイルすると、latexmkrc の記述を無視して pdflatex が使われてしまうのは何故?
A: (1) エディタが付加している latexmk のオプションに -pdf が含まれていたから (2) latexmkrc の問題(正しく読み込まれていない、実はうっかり別のファイルで $pdf_mode やオプションを指定してしまっていた、など)
Q: 作業ディレクトリをカレントディレクトリとして動作させたシェル(cmd, PowerShellなど含む)で latexmk を実行したらうまくいくのに、エディタの拡張機能とかで latexmk を使ってコンパイルすると失敗するのは何故?
A: ディレクトリのパスやファイル名に、漢字や空白文字が含まれていたり、ネットワークパス(Windowsの場合)だったりするとうまくいかないときがあります。

Visual Studio Code + LaTeX Workshop ではまっていたのです

texファイルのホームディレクトリに latexmkrc を作って、

$pdf_mode = 3;
$latex = 'platex -synctex=1 -halt-on-error %O %S';
$dvipdf = 'dvipdfmx %O -o %D %S';
$bibtex = 'pbibtex %O %B';
$max_repeat = 5;

とか書いておけば、 platex と dvipdfmx を使って良い感じに仕上げてくれるはず、なのですが、 vscode と latex拡張の組み合わせでは、何故かpdflatex が実行されてしまいます。何故? latexmkrc が読まれてないのか? と思ったのですが、 理由は package.json で設定されている latex-workshop.latex.tools にありました。
https://github.com/James-Yu/LaTeX-Workshop/blob/v7.0.1/package.json
            {
              "name": "latexmk",
              "command": "latexmk",
              "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-pdf",
                "-outdir=%OUTDIR%",
                "%DOC%"
              ],
              "env": {

              }
            },
そこに-pdfが書いてあるせいです。これを書かれてしまうと latexmkrc が $pdf_mode を指定しても無視するんですよね…勘弁してほしいなあ…

(2021年12月追記:最近では "latexmk(latexmkrc)"というものが追加されており、argsに何も設定されていないモードが追加されていましたので、これを使うとよいでしょう。)  

対策は、latexmk のツールの設定を上書きし、 -pdf オプションを外すことです。
ファイル→基本設定→設定、を選び、latex-workshop.latex.tools を検索し、settings.json をクリックします。
表示されるjsonファイルに "latex-workshop.latex.tools" 要素を入れてしまいましょう。 補完入力に乗っかると全部書かれてしまいますが、latexmk の args(引数)に該当する部分をよく見て、
    "latex-workshop.latex.tools": [
        {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-outdir=%OUTDIR%",
                "%DOC%"
            ],
            "env": {}
        }
    ]
などとすればよいでしょう。

2019年5月13日月曜日

e2ps の修正パッチを一段落させた

 Linux などで日本語テキストファイルをPostScript形式に変換するソフトウェアの一つに e2ps があるのですが、いろいろバグが多くて困っており、一昨年くらいからちまちまと直したりしていました。
http://taraijpn.blogspot.com/2017/06/e2pspatch.html

 とりあえず Debian BTS で公開されているバグを直すところまで出来たので改めて紹介します。修正点は以下の通り。
  • フォントリストの文字型配列がコンパイル不能な書き方だった点を修正。
    • 各ディストリビューションで対応されています。
  • 用紙サイズのポイント数を PostScript の仕様で使われている数に合わせて修正。
    • 一部ディストリビューションで対応されています。
  • 生成される PostScript が EPS だった問題などを修正。
    • これでようやく fixps に怒られずに済みます。
  • 出力したページ数が誤っていた問題を修正。
    • ja_JP.EUC-JP 環境以外で動いているときに起こる問題でした。
  • ヌル文字から始まるテキストファイルが与えられるとクラッシュする問題を修正。
    • これは  https://bugs.debian.org/715852 で報告されていたものです。ヌル文字しかない、もしくはヌル文字から始まる(という意地の悪い)テキストファイルを印刷しようとすると起こる問題です。
  • 複数のファイルをまとめて変換すると、他のファイルの印刷末尾に余計な文字列が含まれる問題を修正。malloc を全て calloc に書き換えた。
    • e2ps README.euc README.english などとして出来たファイルを見たとき気づきました。環境依存?
  • Letterサイズで2面付け(-p2, -l2)を行うと用紙をオーバーする問題を修正。
    • 用紙のアスペクト比を維持するか、アスペクト比を歪めて紙面を広く使うか、どちらか悩んだ結果、前者を取りました。本来であればマージンを調整すべきところなのですが、それは全ての用紙サイズで考えないといけないことなので棚上げ。
  • PostScript の作者 ( %%Creator: ) は e2ps であるものとした。
    • CREATOR は help で使ってたので手を入れました。

 以上の内容を、patch1 として公開しました。(2019/5/14 patch1タグを打ってあります。
https://gist.githubusercontent.com/taraijpn/ea10ff9e908befafab7cff719f26dd20/raw/9a4a6fd502958a0e87db364174cbc331d07055be/e2ps-4.34.patch


 実はもう少しやらないといけないことがあって、
  • 変数の型を整理する。
    • unsigned char を使わないようにする。そもそも string.h で読んでいる関数と合わず warning が出ます。
    • unsigned char や signed char といった型は使わないようにして、コンパイラの警告をなくす。
  • 読み込めるファイルサイズを制限する。(2GB程度の予定)
    • unsigned long を size_t に直したらえらいことになったので。
 機械的な置き換えで問題ないかと思ったのですが、そんなに甘くなかった。sjisの変換に失敗する、とか、READMEにある他アーキテクチャ対応に悪影響が及びそうな気がするので、ちょっと止めてあります。とりあえず patch1 の上流での採用を目指したいところ。

 なお上流への連絡は、WebページにあるCGIで掲示板への書き込みやメールの送信を試みましたがいずれもエラーで動かず、2015年に公開されていたWindowsのプログラムにあるreadmeにメールアドレスが掲載されていたので、そこに送っています。果たして無事届いていますでしょうか……