本文中に出てくる長い変数に任意位置改行指定入れていいか問題 #技術書です
— Jun Tajima (@JunTajima) 2016, 1月 8
技術系のドキュメントでは、長い連続した英数字からなる文字列を等幅フォントで組む必要に迫られることが多々あります。 本文中にそんな文字列が連続して出現する原稿を、字間が異常に空いたり版面をはみ出したりすることなく組版するためのベストプラクティスは、有識者の間でも意見が分かれるようです。 うまく自然な改行位置に収まるように原稿のほうに手をいれられればベストですが、政治的経済的な理由で困難だったり、そもそも解説内容からして無理筋という場合もあります(Javaの変数名とかJavaの変数名とか)。
よくあるのは、空白やハイフンや記号文字の直後に恣意的な改行位置を指定する、という方法でしょう。 変数名を英単語の組み合わせだとみなすなら、この方法が自然に思えます。 キャメルケースの大文字の手前を恣意的な改行位置にすることもありうるでしょう。
しかし、「英単語として有意味な改行位置」は、このような文字列にとって必ずしも適切な改行位置ではないはずです。 たとえば、空白とかハイフンで区切ってしまうと、文字列のその部分に文字通り空白やハイフンがあるのか、たまたま改行があって空白やハイフネーション記号が挿入されているのか、区別しにくくなります。 キャメルケースの大文字の手前で改行されていると、その位置に文字通りの空白が入る可能性が気になって仕事になりません。 もちろん読者として読むなら意味を考えて区別できるんですが、作り手側にいると「勘違いして読まれたらまずいのでは」という不安をぬぐえないということです。
で、最近は、任意の文字間で改行するという思い切ったルールにするほうが理に適っているのではないかと考えるようになりました。
つまり、英数字の文字列ではあるけど、日本語や中国語のように組むわけです。
任意の音節区切りで改行くらいのほうが穏当な気もしますが、Webページだとword-wrap: break-word;
が指定されている例も見かけるし、これをTeXでやってみようというのが本題です。
結論から言うと、seqsplitというパッケージがあります。もともとはDNAなんかの塩基配列を組むためのパッケージで、TeX Liveにも入ってます。
つまり、acgtの4文字からなる長大な文字列をページに組むことを目的にしています。
これを以下のような感じに使うことで、任意の位置で改行可能なバージョンの\texttt
が実現できます(実行例)
\usepackage{seqsplit} \usepackage{fancyvrb} \VerbatimFootnotes \makeatletter % \def\seqinsert{\ifmmode\allowbreak\else\hspace{0pt plus 0.02em}\fi \def\wordwraptt{\begingroup\obeyspaces\do@codeline} \def\do@codeline#1{\texttt{\seqsplit{#1\relax}\endgroup}} \makeatother \begin{document} Wikipediaによると、Brain*uckでは \wordwraptt{% ++++++++[>++++[>++>+++>+++>+<<<<-]% >+>+>->>+[<]<-]>>.>---.+++++++..+++.>>% .<-.<.+++.------.--------.>>+.>++.% }というHello World!プログラムが書けます。 \end{document}
fancyvrbパッケージを読み込んでいるのは、\VerbatimFootnotes
を使うためです。
このコマンドが提供するような仕組みがないと、\wordwraptt
を脚注に配したときにスペースがなくなってしまいます。
改良したい点として、事前に中身の文字列を数えてあまり短いものは改行しないようにするといった処理もしたほうがよさそう。
(\penalty
による調整は試してみたけれどあまりうまくいかなかった。)
なお、上記のような異常ケースでない場合は、Listingsというパッケージを使って\lstset{breaklines=true, breakatwhitespace=true}
という設定をしてあげることで、そこそこ妥当な結果になるかもしれません。
(追記)さっそく改良案をいただきました。
例えばJavaのソースでは通例ゆきだるま☃の文字は現れないので、ソースを“分綴”するときにハイフンの代わりに☃を書くことにすれば、万事解決。 #しない pic.twitter.com/U4CjKoYtDW
— ☃ZR-TeXnobabbler☃ (@zr_tex8r) 2016, 1月 8あながちネタでもないと思っていて、似たようなことは考えていました(さすがに雪だるまをつかう発想はなかったけれど)。 上の例のコードブロックではコメントアウトしてある
\seqinsert
の再定義部分を書き換えると、このようなことが可能になります。
宣伝
TechBoosterがC89で頒布した6点のラインナップでは、上記のような仕組みを使うことで、Re:VIEWからでは制御困難な長い変数名の折り返し調整をなんとかしてみました。 が、コマンド中のスペースの存在を根本的に見逃すという大変残念かつ申し訳ない失敗をしています。本当にすみません。 電子版はなおっているはずなので、本誌に挿入されているQRコードでぜひ電子版も入手してください><
TechBooster in C89 特設ページ
というわけで、いろいろ微妙なTeXマクロだけど(LaTeXのことは知らない)、冒頭のツイートで思い出したのでネタとして。
0 件のコメント:
コメントを投稿