2016年7月25日

割注したいって話.JLREQにも記述があるので,これをしたい.といっても見た目自身は半分くらいのフォントサイズで二行に並べて書けばよいようだ.イメージとして

何か文章\warichu{割注,ゲットだぜ!}があるかも
という感じで入るといいなぁ,と.探してみると,藤田さんのwarichu.styがあるようだが,ぱっと見は求めているものとは違うような気がしている.

二行に並べるのはあまり難しくない.ただ自動改行させるとなると現在の位置が欲しくなる(TeXの改行処理に任せる,というのは難しい気がする).LuaTeXならば\saveposでできそうだ,と思い試してみた.

なお,TeX Q&Aには例によって既に質問されている.二つほど回答をメモ代わりにリンク:その1その2\(pdf)saveposが使える状況下ではそっちの方が強力に思えたので,そっちの方向で考えてみる.(ちなみにググると前の回答の方針1に従ったコードも見つかった.)なお現状ではe-pTeXですら\pdfsaveposをサポートする.

とりあえず使ってみよう.ZRさんの回答に紹介されているlinegoalパッケージを使っても良いが,ここではzrefパッケージを使ってPDFの位置を直接取得し,そこから求めてみることにする.(ちなみにlinegoalパッケージも内部ではzrefパッケージを使っている.)saveposモジュールは\pdfsavepos\pdflastxposをラップしたような機能を提供する.使い方は簡単で,

\documentclass{jsarticle}
\usepackage[savepos]{zref}
\begin{document}
zrefパッケージのsaveposを試してみる.
\zsavepos{label}% この位置をラベル名labelで保存する
この文章の先頭位置のx座標は\zposx{label}である.
\end{document}
という感じ.\zsaveposを実行した位置を.auxに書き込み,.auxに書き込まれた場所のx座標を\zposxで参照できる(単位はsp).これを使うと,とりあえずではあるけど現在行の残り長さは
  \dimexpr\linewidth + \@totalleftmargin
    \ifodd\c@page
      \oddsidemargin
    \else
      \evensidemargin
    \fi
  + 1in + \hoffset - \zposx{<label名>} sp\relax
という感じで取得できる.linegoalパッケージにもある通り,ページ数ももっとまじめに参照することにする.ページ数は\label\pagerefで取得できるが,\pagerefが??を返す時の処理が面倒なので,やはりzrefパッケージに頼ることにする.というわけで,とりあえず「残り行位置で二つに分割する」というコードを書いてみた.

\makeatletter
\newcount\warichucount
\newcommand{\remainlength}{%
  \dimexpr\linewidth + \@totalleftmargin
    \ifodd\zref@extractdefault{warichu.page.\the\warichucount}{page}{\c@page}
      \oddsidemargin
    \else
      \evensidemargin
    \fi
  + 1in + \hoffset - \zposx{warichu.posx.\the\warichucount} sp\relax
}

\newcommand{\warichu}[1]{%
  \zsavepos{warichu.posx.\the\warichucount}%
  \zref@labelbyprops{warichu.page.\the\warichucount}{page}%
  \ifvmode\leavevmode\fi
  \@tempdima=\remainlength
  \setbox\@tempboxa=\vbox{\parshape 2 0pt \the\@tempdima 0pt \the\linewidth #1\par}%
  \hbox to \@tempdima{\vsplit\@tempboxa to \baselineskip}%
  {\setbox\@tempboxa=\vbox{\unvbox\@tempboxa\global\setbox\@tempboxa=\lastbox}}%
  \ifvoid\@tempboxa\else\ifhbox\@tempboxa\\\hbox{\unhbox\@tempboxa\unskip\unskip\unpenalty}\fi\fi
  \advance\warichucount by 1\relax
}
\makeatother

で,試してみた.

\documentclass[a4paper]{ltjsarticle}
\usepackage[savepos]{zref}
%(上のコードを入れる)
\textwidth=5\zw
\parindent=0pt
\begin{document}
アア
\warichu{あいう}
イイ
\end{document}

文章中くらいならばこれでうまく行くかな?

追記:あほなコードを書いていました.まず縦方向の測定なのに\oddsidemargin等を使うのはおかしいです.また縦書き横書き関係なく,\lastxposは横方向を返すべきのようです.チケット #36489

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です