自作ボックスのタイトル部分を改行できるようにしてみたい。

自作ボックスのタイトル部分を改行できるようにしてみたい。

- KK TeX の投稿
返信数: 9

添付したファイルにあるのは、友人が原型を作成してくれたボックスで、自分の環境用に微調整して使っているボックスなのですが、これのタイトル部分にあまり長いものを入れすぎるとタイトル部分からはみ出てしまいます。

というのもボックスの構造上、サブタイトル部分を入れるボックスが可変長(いちいち入力によって長さが変わってしまう)ため、parboxで回避しように引数に「入力した文字列の横幅の合計値」を取らないといけないため、絶対に手動処理が必要になってしまい、マクロにできないからです。

サブタイトル部分の長さを計算してピッタリ収まる長さのparboxに入れ、ボックスの横幅から引いた上でさらにタイトルの入る部分のボックスを求めた長さのparboxに格納するとかでもしないと無理な気がしており、かなりの苦戦を強いられています。

どなたかいい案を授けてくださる方はいらっしゃいませんでしょうか。

KK TeX への返信

Re: 自作ボックスのタイトル部分を改行できるようにしてみたい。

- 和田 勇 の投稿

aoharu と hannari フォントは test3.tex では使用していないのでコメントアウトして検証しました。

いくつか方法はあると思いますが、サブタイトルを含むタイトル部分の幅\settowidth で取得して、それを \textwidth と比較しその真偽で制御する方法はどうでしょうか?

なお、限界までテストしていないので \textwidth との比較では若干の補正が必要になることがあります。

それから、nあぜか ptbs 環境をマクロに取り込んだら、本文の先頭のアキが消えてしまったり、 一行の送り込みが変わってしまいました。暇を見て追及しますが ....

検証に使用した .tex などは念の為添付しますが、 今回用のマクロです。適宜修正してください。

     \newlength{\myTitleLength}

     \newcommand{\myPTBS}[3]{
       \settowidth{\myTitleLength}{#2 #1}
       \ifthenelse{\myTitleLength < \textwidth}% .9\textwidth が必要かな
       {% タイトルとサブタイトルの幅が一行に収まる時
         \begin{ptbs}[#1]{#2}
           \textgt{#3}
         \end{ptbs}}
       {% タイトルとサブタイトルの幅が一行の幅を超える時
         \begin{ptbs}[\parbox{44em}{#1}]{\parbox{1cm}{#2}}
           \textgt{#3}
         \end{ptbs}
       }
     }
和田 勇 への返信

Re: 自作ボックスのタイトル部分を改行できるようにしてみたい。

- 和田 勇 の投稿

「本文」部分の先頭行の最初のアキについて

誤変換したまま、投稿していましたね、申し訳ないです。

さて、私の提案したマクロの改修も考えたのですが、サンプルとして示された

     \textgt{
       本文本文本文本文本文本文本文本文
       ....
     }

\textgt{ の直後の改行が影響しているようです。

     \textgt{%
       本文本文本文本文本文本文本文本文
       ....
     }

     \textgt{本文本文本文本文本文本文本文本文
       ....
     }

のように余分な改行を抑制すると、行頭の妙なアキはなくなります。

和田 勇 への返信

Re: 自作ボックスのタイトル部分を改行できるようにしてみたい。

- KK TeX の投稿
和田さん、今回もありがとうございます。その条件分岐のアイデアは私にありませんでしたので、目から鱗です。

なるほど、確かにそのやり方でアキはなくなるようです。

いただいたアイデアをもとに私の方でも色々微調整してみまして、2段組に対応したものにしてみました。

\newlength{\myTitleLength}
\newcommand{\myPTBS}[3]{
\settowidth{\myTitleLength}{#2 #1}
\ifthenelse{\myTitleLength < \columnwidth}% .9\textwidth が必要かな
{% タイトルとサブタイトルの幅が一行に収まる時
\begin{ptbs}[#1]{#2}
\textgt{#3}
\end{ptbs}}
{% タイトルとサブタイトルの幅が一行の幅を超える時
\begin{ptbs}[\parbox[b]{\columnwidth-1.2cm}{\setstretch{0.8} \vspace*{0.8mm}#1}]
{\parbox[b]{1cm}{\setstretch{0.8} \vspace*{0.8mm}#2}}
\textgt{#3}
\end{ptbs}
}
}

ひとまず目的は達成されたように思います。

ところで、これはptbsを使っていた時からあったことなのですが、レイアウトによって(たいていminipageかmulticol使用時)にボックス内に出してもいない横線が入ってしまうことがあるのです。横線のところだけ変な行間の調整が入っているようですが、原因は不明です。これ何が影響してると思われますでしょうか。
KK TeX への返信

Re: 自作ボックスのタイトル部分を改行できるようにしてみたい。

- 和田 勇 の投稿

レイアウトによって(たいていminipageかmulticol使用時)に不要な横線が混入することあり

具体的な症状を見せていただかないと、なんとも言えません。

とはいえ、コーディングを見ると \titlelength のマクロで \setlength{\len}{\linewidth}\linewidth を使っていますね。

この \linewidth を使う場合は、若干注意が必要です。

【2段組で注釈】和田の回答 にも参考URL は 記されていますが、 Difference between \textwidth, \linewidth and \hsize 内の Answers 部分 353 を 参考に、ptbs の宣言で \titlelength\len の扱いを検討する必要があるのではと考えています。

もしかしたら \linewidth を \textwidth に書き換えるだけで済むかもしれませんが、 再現するソースが出来たら連絡ください。

和田 勇 への返信

Re: 自作ボックスのタイトル部分を改行できるようにしてみたい。

- KK TeX の投稿
すみません、横線とは関係ない別件です。
\newlength{\myTitleLength}\newlength{\myTitleheight}\newlength{\mysubTitleheight}

\newcommand{\myPTBSS}[3]{
\settowidth{\myTitleLength}{#2 #1}
\settoheight{\myTitleheight}{\parbox[b]{\columnwidth-1.2cm}{\setstretch{0.8} \vspace*{0.8mm} #1}}
\settoheight{\mysubTitleheight}{\parbox[b]{1cm}{\setstretch{0.8} \vspace*{0.8mm} #2}}

\ifthenelse{\myTitleLength < \columnwidth}% .9\textwidth が必要かな
{% タイトルとサブタイトルの幅が一行に収まる時
\begin{ptbs}[#1]{#2}%
\textgt{#3}
\end{ptbs}}
{% タイトルとサブタイトルの幅が一行の幅を超える時
\ifthenelse{\myTitleheight < \mysubTitleheight}{
\begin{ptbs}[\parbox[b][\mysubTitleheight][b]{\columnwidth-1.2cm}{\setstretch{0.8} \vspace*{0.8mm} #1}]
{\parbox[b][\mysubTitleheight][b]{1cm}{\setstretch{0.8} \vspace*{0.8mm}#2}}%
\textgt{#3}
\end{ptbs}}
{\begin{ptbs}[\parbox[b][\myTitleheight][b]{\columnwidth-1.2cm}{\setstretch{0.8} \vspace*{0.8mm} #1}]
{\parbox[b][\myTitleheight][b]{1cm}{\setstretch{0.8} \vspace*{0.8mm}#2}}%
\textgt{#3}
\end{ptbs}
}
}
}

}

コーナーケース対応のために、1つ条件分岐を追加してみたのですが、
2つ目のifのfalse側で、せっかく設定した高さにタイトルボックスの高さが合わないという問題が発生しました。ifthenelseのネストがまずいんでしょうか。

ケース2
\myPTBSS{タイトルタイトルタイトルタイトルタイトルタイトルタイトルタイトルタイトルタタイトルタイトルタイトルタイトルタイトルタイトルタイトルタイトルタイトルイトルタイトルタイトルタイトルタイトル}
{サブタイトル}
{いろはにほへとちりぬるをいろはにほへとちりぬるをいろはにほへとちりぬるをいろはにほへとちりぬるをいろはにほへとちりぬるを}

でテストしています。
KK TeX への返信

Re: 自作ボックスのタイトル部分を改行できるようにしてみたい。

- 和田 勇 の投稿

主な原因

長いタイトル用の幅を ...\parbox[b]{\columnwidth-1.2cm}... と しても計算してくれません。

マクロ \titlelength\len の計算を \linewidth を元に \addtolength で 計算しているようにしてみました。

なお 1.2cm の補正では意図された結果が得られないので試行錯誤の上 1.4cm で 調整しましたが、限界値までの検証は行っていませんので、その点を考慮の上、 検討してください。

この部分に関する、差分は以下のとおり。

     +\newlength{\myLongTitleWidth}% 長いタイトルを想定した時の幅
     +\setlength{\myLongTitleWidth}{\columnwidth}% {\columnwidth-1.2cm} の意図の反映
     +\addtolength{\myLongTitleWidth}{-1.4cm}% でも 1.2cm では足りないので

      \newcommand{\myPTBSS}[3]{
        \settowidth{\myTitleLength}{#2 #1}
     -  \settoheight{\myTitleheight}{\parbox[b]{\columnwidth-1.2cm}{\setstretch{0.8} \vspace*{0.8mm} #1}}
     +  \settoheight{\myTitleheight}{\parbox[b]{\myLongTitleWidth}{\setstretch{0.8} \vspace*{0.8mm} #1}}

minipage multicolumn と \linewidth vs \textwidth

minipage 環境などで、意図しない が生じる場合があるとのことでしたが、 \linewidth の影響かと書き込んだので、念の為 minipage multicolum 環境で試してみました。

test3.tex のソースを元にしたものでは、 \parbox{44em}{...} の部分は、当然おかしくはなりますが、 その他は特段おかしな状況は発生しないようです。

KK TeX への返信

Re: 自作ボックスのタイトル部分を改行できるようにしてみたい。

- 北見 けん の投稿
サブタイトルとタイトルを合わせて1行に収まらない場合に、そのままタイトルだけ改行するのではなくてサブタイトルのほうも1cm幅で改行しているようですが、これが仕様ということなのですか?
北見 けん への返信

Re: 自作ボックスのタイトル部分を改行できるようにしてみたい。

- KK TeX の投稿
改行するとなった時に、2つのボックスの衝突を避けるためどこかのタイミングでサブタイトルの方を固定長にせざるを得ないです。そのための条件分岐後の1cm幅のparboxの導入はベストだと思います。(僕がコードを書いたわけではないですが...)
KK TeX への返信

Re: 自作ボックスのタイトル部分を改行できるようにしてみたい。

- 北見 けん の投稿
そうすると、サブタイトルとタイトルを一行で並べたときにははみ出していても、それゆえにサブタイトルを1cm幅で改行するモードに移行した際に今度はタイトルのほうは改行せずに1行で済んでしまう、ということが起こってもそれでよい、という仕様なのですね。なるほど。
(ご質問のほうは和田さんの回答で解決したようですので、これにて)