6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SATySFiの標準クラスで長いタイトルを無事に出力する(アレな)方法

Last updated at Posted at 2018-12-09

これは「SATySFi Advent Caleandar 2018」の10日目の記事です。
(9日目は bd_gfngfnさん でした。11日目は youzさん です。)

stdjaでタイトルが長くなるとアレ

SATySFiの標準クラス(stdjaクラスなど)においては、タイトル(文書表題)は中央揃えで出力されます。

sample1.saty
@require: stdja

document (|
  title = {今日はマナー違反}; % フツーのタイトル
  author = {ブランチュール非過激派};
  show-title = true; show-toc = false;
|) '<
  +p{意味はまだ無い。}
>

sample1.png

ところが、タイトルのテキストが長くなって1行に収まらない場合、中央揃えの結果がアレになってしまいます。

sample2.saty
@require: stdja

document (|
  % うわっ…私のタイトル、長すぎ…?
  title = {オレの\SATySFi;文書のコンパイルが
      一発で通ったから今日はマナー違反};
  author = {ブランチュール非過激派};
  show-title = true; show-toc = false;
|) '<
  +p{意味はまだ無い。}
>

sample2.png

アレ不可避の予感

この不具合の直接の原因は、「タイトルに適用されている中央揃えの実装が複数行のテキストに対応していない」ということです。なぜそんな実装になっているのかというと、その背景には**「中央揃えと自動行分割の両立が難しい」という理由があります。この辺りの話は『The SATySFibook』の5.3節「行分割を行なうコマンド」において説明されているので、詳しくはそちらを参照してください。要するに、中央揃えを適用する段落においては自動の行分割は困難であるため、少なくとも「ユーザがあらかじめ行分割した形のテキストを入力に与える」**という仕様にする必要があるわけです。

そして、「あらかじめ行分割する」という仕様の下では複数行にわたる中央揃えは実現できます。つまり次のようなブロックコマンド+centeringsは実装可能です。(実装コードは『The SATySFibook』を参照。)

% +centerings : [inline-text list] inline-cmd
% 引数のリストの各々の行を中央添揃えにしたものを行送り方向に
% 並べた段落を出力する.
+centerings{
| オレの\SATySFi;文書の
| コンパイルが一発で通ったから
| 今日はマナー違反
|}

% {|ほげ|ふが|ぴよ|} は [{ほげ}; {ふが}; {ぴよ}] の構文糖衣で
% inline-text list 型をもつ.

それなら、タイトルの出力についても同じ実装に変えればよい、と思うかもしれませんが、話はそう簡単ではありません。現在のstdjaのタイトル部分(document引数のtitleラベルの値)はinline-text型ですが、新しい実装を使うとinline-text list型に変わります。つまり、文書ソースのレベルで互換性が失われてしまいます。

  % +centerings と同様の実装を導入するとなると,
  % 常にinline-text listを指定する必要がある.
  title = {|今日はマナー違反|};

将来に仕様変更が行われる可能性はありますが、いずれにしても、現状の実装においては、複数行のタイトルを正常に出力する真っ当な策はなさそうです。

無慈悲なバッドノウハウ

仕方がないので、ここはバッドノウハウに訴えることにしましょう。次のような手順を使います。

  • 先述の考えと同じく、ユーザがあらかじめめテキストの行分割位置を決めておく。
  • pervasivesパッケージ(標準配布)を読み込む。
  • タイトルのインラインテキストを書く際に、分割後の各行を\no-breakコマンドで包む。
  • さらに、分割位置に\fil-bothコマンドを挿入する。

この手順に従ってsample2.satyを書き直すと以下のようになります。

sample3.saty
@require: stdja
%↓これを追加
@require: pervasives

document (| % \fil-both;の直後の改行文字は % で無効化しておく
  title = {\no-break{オレの\SATySFi;文書の}\fil-both;%
           \no-break{コンパイルが一発で通ったから}\fil-both;%
           \no-break{今日はマナー違反}};
  author = {ブランチュール非過激派};
  show-title = true; show-toc = false;
|) '<
  +p{意味はまだ無い。}
>

sample3.png

マトモな出力になりました!

補足

実はここで紹介した方法には元ネタがあって、それはSATySFiのドキュメントの一つである doc/doc-primitives.saty のタイトルです。

image11.png

gfn氏も使ってるんだから問題なし!(多分)

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?