縦書きだと ulem パッケージの \sout{} が中央からずれる

縦書きだと ulem パッケージの \sout{} が中央からずれる

- O Kay の投稿
返信数: 8
時々縦書きの文を upLaTeX で使用しております。
将来どなたかが tsarticle を作ってくださることを期待しつつ,現在は下記の方法でしのいでいます。
https://www.overleaf.com/read/qkvrbgzqrmrv#/6866671/

さて,下記のソースで ulem パッケージの \sout{}(訂正線)コマンドを使用しますと,線が中央からずれます。

pLaTeX を改訂すべきなのか,ユーザーサイドで対処すべきかわかりませんが,日本語 TeX 開発コミュニティ様にご報告申し上げます。

なお,最近開発された jlreq クラスでもうまくいったこともご報告申し上げます。


%%%%%%%%%%
\documentclass[uplatex]{jsarticle}
%%% この部分が jsarticle で縦書きを実現する方法(doraTeX さんのアイディア)
\makeatletter
\AtBeginDocument{\tate\adjustbaseline}
\setlength\@tempdima{\textheight}
\setlength\textheight{\textwidth}
\setlength\textwidth{\@tempdima}
\let\@temp\@evenhead
\let\@evenhead\@oddhead
\let\@oddhead\@temp
\fullwidth\textheight
\makeatother
%%%%% ↑と↓,どちらか一方を選択
%\documentclass[tate,uplatex]{jlreq}
%%%%%%%%%%

\usepackage[jis2004]{otf}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{ulem}

\makeatletter

\renewcommand{\thesection}{%
{第}\protect\hantate{{\@arabic\c@section}}{段}%
}

\renewcommand{\section}{%
\@startsection{section}{1}{\z@}%
{\Cvs \@plus.5\Cdp \@minus.2\Cdp}%
{.5\Cvs \@plus.3\Cdp}%
{\normalfont\large\headfont\raggedright}%
}

\chardef\zenkakuSpace=\jis"2121\relax

\def\hantate#1{%
\@tfor\@tempa:=#1\do{%
\ifvmode \leavevmode \fi
\iftdir%
\zenkakuSpace\kern-1zw\relax%
\hbox to 1zw{\hss\hbox{\yoko\@tempa}\hss}\relax%
\kern-1zw\relax\zenkakuSpace%
\else%
\hbox{\@tempa}%
\fi%
}%
}

\makeatother


\begin{document}

\section{春}
春はあけぼの。やうやう白くなりゆく山際、少し明かりて、紫だちたる雲の細くたなびきたる。

\section{夏}
夏は夜。月のころはさらなり、闇もなほ、蛍の多く飛びちがひたる。また、ただ一つ二つなど、ほかにうち光て行くもをかし。雨など降るもをかし。

\section{秋}
秋は夕暮れ。夕日の差して山の端いと近うなりたるに、烏の寝所へ行くとて、三つ四つ、二つ三つなど飛び急ぐさへあはれなり。まいて雁などの連ねたるが、いと小さく見ゆるは、いとをかし。日入り果てて、風の音、虫の音など、はた言ふべきにあらず。

\section{冬}
\sout{冬は☃。雪の降る中はしゃぎつつ☃を作るは、いとをかし。}%
冬はつとめて。雪の降りたるは言ふべきにもあらず、霜のいと白きも、またさらでもいと寒きに、火など急ぎおこして、炭持て渡るも、いとつきづきし。昼になりて、ぬるくゆるびもていけば、火桶の火も、白き灰がちになりてわろし。


\appendix
\section{\texttt{$\backslash$hantate\{\}}の使い方}

\verb|\hantate{}|は,縦書き時に\verb|{}|内の半角文字を,\hantate{1}文字ずつ縦に並べます。その際,各文字は和文文字扱いされます(和文ゴーストの考え方を利用しました)ので,前後の文字に応じて,\verb|\kanjiskip|や\verb|\xkanjiskip|が入ります。引数をさらに\verb|{}|でくくれば,縦中横を実現できます。なお,文字は中央に配置されるので,\hantate{x}や\hantate{{fx}}や\hantate{{qx}}などを横に並べると,高さはそろわないことになります。

\hantate{2017}年\hantate{{12}}月\hantate{8}日に,第\hantate{888}回全日本☃大会が開催されます。数学Ⅲと数学\hantate{{III}}を学習する。鍋に二八〇\hantate{{cc}}の水を入れて約三分間踊ります。

\framebox[25zw][s]{こんにちは。ものクロの皆さん。}\par
\framebox[25zw][s]{こんにちは。\hantate{SKB{48}}の皆さん。}\par
\framebox[25zw][s]{こんにちは。\hantate{xxxx}の皆さん。}\par
\framebox[25zw][s]{こんにちは。\hantate{{(x}{jx}{fx}{qx}}の皆さん。}\par

\end{document}

O Kay への返信

Re: 縦書きだと ulem パッケージの \sout{} が中央からずれる

- aminophen の投稿
ulem パッケージの線が中央にこない,ということですが,これは単に海外製ゆえに縦組をサポート
できていないだけだと思います。
これは pLaTeX 本体の問題にはあたらないので,pLaTeX 側で改修すべきとは思いません。

したがって,ケースごとにユーザサイドで対処するのが筋でしょう。

一つ確認ですが

> なお,最近開発された jlreq クラスでもうまくいったこともご報告申し上げます。

うまくいった,とは,ただ単にコンパイルが通ったということですね?
(私の手元では「\headfont が未定義」というエラーが出てしまうので
\let\headfont\relax として初めてコンパイルが通るのですが。)
結果を見るに,やはり中央から線がずれていますので。
aminophen への返信

Re: 縦書きだと ulem パッケージの \sout{} が中央からずれる

- aminophen の投稿
で、「ユーザサイドでどう対処するか」というとたとえば

\usepackage{ulem}

のあとに

\def\sout{\bgroup \ULdepth=0ex \ULset}

とかくと真ん中に打消し線がくるような気がします。
# ulem.sty をみると
# \def\sout{\bgroup \ULdepth=-.55ex \ULset}
# と書かれていて、このパラメータを弄ってみただけですが。
aminophen への返信

Re: 縦書きだと ulem パッケージの \sout{} が中央からずれる

- O Kay の投稿
お返事ありがとうございます。また,直し方もありがとうございます。

> うまくいった,とは,ただ単にコンパイルが通ったということですね?
> (私の手元では「\headfont が未定義」というエラーが出てしまうので
> \let\headfont\relax として初めてコンパイルが通るのですが。)
> 結果を見るに,やはり中央から線がずれていますので。

あっ,説明不足でした。タイプセットは通るけど,線は中央からずれているということでした。
(\headfont 未定義エラーとは変ですね。私の環境は2017/2/10角藤版です。)

以前,\tbaselineshift がどうのこうのという話題があったようなので,関係あるのかなと思い,投稿しました。


すみません,jlreq がらみで,1つ追加質問いいですか?
j-classes では欧文 10pt に対し,和文9.62216pt,
js-classes では欧文 10pt に対し,和文9.2469ptと言われていますが,
jlreq の場合どうなのでしょうか。

O Kay への返信

Re: 縦書きだと ulem パッケージの \sout{} が中央からずれる

- aminophen の投稿
jsarticle の場合はご提示のソースのままで通ります。
jlreq の場合に「\headfont 未定義」というエラーが出るのは自然です。
なぜなら,jsarticle.cls は

\newcommand{\headfont}{…略…}

としていますが,jlreq.cls にはこのような定義がないからです。
(私は 2017/04/04 の jlreq.cls を持っています)
したがって,ご提示のソースで

\renewcommand{\section}{%

の中で \headfont を使用していらっしゃる以上,むしろエラーが出ない方が変です。

> jlreq の場合どうなのでしょうか。

jlreq.cls の設計は私はまだ研究できていないので存じません。
aminophen への返信

Re: 縦書きだと ulem パッケージの \sout{} が中央からずれる

- O Kay の投稿
> したがって,ご提示のソースで
> \renewcommand{\section}{%
> の中で \headfont を使用していらっしゃる以上,むしろエラーが出ない方が変です。

はい,\headfont は jsarticle からの引用です。
おそらく,jlreq.cls の改訂で \headfont が削除されたのではないかと思います。
私の手元のそれを検索したら,あちこちに見つかりました。
一応,添付しておきます。

O Kay への返信

Re: 縦書きだと ulem パッケージの \sout{} が中央からずれる

- O Kay の投稿
すみません,和文と欧文の文字サイズの関係,自己解決しました。こう書いてありました。

\jafontsize

和文フォントサイズを指定する\fontsizeです.クラスオプションでfontsize=10pt,jafontscale=0.9とされている場合,\fontsize{9pt}{9pt}とすると和文フォントのサイズは8.1ptとなりますが,\jafontsize{9pt}{9pt}とすると9ptとなります.(欧文フォントサイズは10ptとなる.)なお,第二引数は\fontsizeの第二引数と全く同じです.


O Kay への返信

Re: 縦書きだと ulem パッケージの \sout{} が中央からずれる

- 阿部 紀行 の投稿
(きちんとulem.styを読んだわけではないので推測ですが)縦書きと横書きのベースラインの違いかと思います.縦書きのベースラインは文字の真ん中になるように調整されますが,横書きはそれより下になります.\soutは,デフォルトではベースラインから-.55exずれた場所に線を引くのだと思いますので,縦書きの場合はずれてしまいます.アセトアミノフェンさんの書かれた
\def\sout{\bgroup \ULdepth=0ex \ULset}
はベースラインから0exずれた(つまりベースラインそのものの)場所に線を引くことを意味しますので,縦書きならばこれで一致するというわけです.

> すみません,jlreq がらみで,1つ追加質問いいですか?
> j-classes では欧文 10pt に対し,和文9.62216pt,
> js-classes では欧文 10pt に対し,和文9.2469ptと言われていますが,
> jlreq の場合どうなのでしょうか。
10ptになります.
  • abenori_devブランチにはjafontscaleとjafontsizeというクラスオプションが存在します.これらを指定している場合は10ptとは限りません.
  • JFMがjlreqパッケージの提供するものから変わっている場合は,やはり10ptではなくなる可能性があります.(たとえばotfパッケージをオプション無しで読み込んだりした場合.)

\headfontに関しては途中で消しました.

阿部 紀行 への返信

Re: 縦書きだと ulem パッケージの \sout{} が中央からずれる

- O Kay の投稿
あっ,作成者様からの直接のお返事,ありがとうございます。
また,詳しい説明もありがとうございました。より理解を深めることができました。

ちなみに,jlreq.cls については,ほんの2, 3のソースファイルでしか試していませんが,otf パッケージの他書体も含めて,うまく動くようです。

普段,ソースファイルの始まりは
\documentclass[uplatex]{jsarticle}
\usepackage{otf}
としていますが,一行目を
\documentclass{jlreq}
に変えるとエラーになり,こりゃ使えん,としばらくは見向きもしませんでしたが,
後から振り返ってみるとフォントがらみのエラーだったので,もしかしてと思い,
\usepackage[uplatex]{otf}
とすると,うまくいきました(あるいはグローバルオプションでもよさそうですね)。

# \headfont についてですが,元々のソースファイルで \section の定義を
# (色をつけるなど)いじくっておりまして,今回の投稿にあたって,
# jsarticle.cls の本来の定義に戻したため,このような記述になりました。