一般的なのは slashbox パッケージを使う方法らしい。
ただし、セルの縦幅が伸びて、斜線もうまく対角線になってくれない等、微妙にうれしくない問題が発生する。
代替品としては diagbox というパッケージがあって、これは、width や height も指定できるようだ。
ただし、左上が天井に揃ってなかったり、右下も少しはみ出たりと、もう少し調整しないと位置揃えが微妙に美しくない。
斜線の両側に項目を表示しなくてよいなら、tikz で斜線を入れるという方法もあるらしい。
出力ドライバーに合わせて、
表中の任意のセルで
ただし、座標は出力を見ながら手動で調整する必要があるので、地味な面倒臭さがある。
参考:
関連:
\usepackage{slashbox}しといて、表中の任意セルで \slash{}{} とか \backslash{}{} とすればよいようだ。
ただし、セルの縦幅が伸びて、斜線もうまく対角線になってくれない等、微妙にうれしくない問題が発生する。
代替品としては diagbox というパッケージがあって、これは、width や height も指定できるようだ。
\usepackage{diagbox}としたうえで
\diagbox[height=\line,width=\textwidth]{}{}とすると、縦幅は1行分(\line)のままで、ほぼ横幅いっぱいに斜線を引けた。
ただし、左上が天井に揃ってなかったり、右下も少しはみ出たりと、もう少し調整しないと位置揃えが微妙に美しくない。
斜線の両側に項目を表示しなくてよいなら、tikz で斜線を入れるという方法もあるらしい。
出力ドライバーに合わせて、
\usepackage[dvipdfmx]{graphicx} \usepackage{tikz}みたいに出力ドライバに合わせて graphicx パッケージを設定した上で tikz を取り込んで
表中の任意のセルで
\tikz[baseline=0pt]{\useasboundingbox(0,0);\draw(0.0,0.40)--(15.60,-0.17);}みたいにすれば良いらしい。
ただし、座標は出力を見ながら手動で調整する必要があるので、地味な面倒臭さがある。
参考:
- マクロツイーター / 2015-06-30: tabular のセルに斜線を入れる話
- 天地有情 / 2016-04-04: diagbox --- 斜線で表ヘッダを生成
関連:
\onecolumn, \twocolumn[2段組み前の1段組み部分] で自動的に改ページして切り替え出来る模様。
2段組み時には \newpage は段区切り相当になる。
多段組にする場合、multicol パッケージを使えば良いらしい。
参考:
関連:
2段組み時には \newpage は段区切り相当になる。
多段組にする場合、multicol パッケージを使えば良いらしい。
参考:
- SFC CNS GUIDE 2001 / LaTeX/LaTeXによる文書整形の応用/段組を制御する
- Kohei Hayashi's web site / Latex
関連:
- CTAN / Packages / multicol
先日
で調べた
参考:
\expandafter\ifx\csname r@LABELNAME\endcsname\relax{undefined}\else{defined}\fi以外にも、
\makeatletter \@ifundefined{r@sec1:OS}{undefined}{defined} \makeatother
\ifcsundef{r@sec1:OS}{undefined}{defined}のような方法もあるようだ。
参考:
- StackExchange / {TeX} / 2016-07-14: How to test if a label exists
- LaTeX.org / LaTeX / General / 2013-10-20: Checking if label defined
地味に面倒臭かった。
他の資料を見ても、だいたい比較周りはだいたい同じ内容で、いろいろと面食らう。
プログラミング言語っぽいけど、結局はマクロってことか?
21世紀の今になってこの環境は、辛いと言うか、辛過ぎでしょう。
良くこんなんであんな綺麗な製版出来てるなと逆に感心する。
いろいろと調べてみた結果、
\edef でマクロに放り込むんで \ifx で比較するか
ifthen パッケージの \ifthenelse の \equal で \string を用いて比較すれば、
文字列の比較は出来そうな雰囲気。
以下のようなマクロと比較があったとして
なお \edef と \ifx の例で \edef ではなく \def を用いると、最後の一つが diff になる。
\ifthenelse は {} を与えると \string が上手く動かないので、sh のようにダミーの x を頭に加えて空文字列の場合 x になるようにしている。
また
\edef, \ifx は 2 行目で、
どちらも \noexpand を使って
他にも、
expl3 パッケージで \strcompare 作る方法とか、
pdftexcmds パッケージの \pdf@strcmp 使う方法とかもあるらしい。
参考:
- Yahoo!知恵袋 / TeX(LaTex) で文字列(2文字以上)の比較方法を教えて下さい
- TeX Wiki / TeX入門/マクロの作成 # 解説 # 条件分岐
TeX には論理式はおろか論理演算子というようなものすらもありません。 TeX で分岐のために扱える条件は,現在の TeX の状態を問い合わせるものや,二つのトークンが同じものかどうか比較するものなど,ごく限られたものしかありません。とか言う状況らしく、生の tex だと単純に文字列を比較する手段は提供されてないらしい。
他の資料を見ても、だいたい比較周りはだいたい同じ内容で、いろいろと面食らう。
プログラミング言語っぽいけど、結局はマクロってことか?
21世紀の今になってこの環境は、辛いと言うか、辛過ぎでしょう。
良くこんなんであんな綺麗な製版出来てるなと逆に感心する。
いろいろと調べてみた結果、
\edef でマクロに放り込むんで \ifx で比較するか
ifthen パッケージの \ifthenelse の \equal で \string を用いて比較すれば、
文字列の比較は出来そうな雰囲気。
以下のようなマクロと比較があったとして
\def\foo{foo}
\ifeqstr{x}{y}{same}{diff} \ifeqstr{x}{x}{same}{diff} \ifeqstr{foo}{bar}{same}{diff} \ifeqstr{bar}{bar}{same}{diff} \ifeqstr{bar}{baz}{same}{diff} \ifeqstr{foo}{}{same}{diff} \ifeqstr{}{foo}{same}{diff} \ifeqstr{}{}{same}{diff} \ifeqstr{foo}{\foo}{same}{diff}\edef と \ifx を使うと
\makeatletter \newcommand{\ifeqstr}[4]{ \edef\ifeqstr@A{#1} \edef\ifeqstr@B{#2} \ifx\ifeqstr@A\ifeqstr@B{#3}\else{#4}\fi } \makeatother\ifthenelse を使うと
\usepackage{ifthen}
\newcommand{\ifeqstr}[4]{ \ifthenelse{\equal{\string x#1}{\string x#2}}{#3}{#4} }とすることで
diff same diff same diff diff diff same sameが得られた。
なお \edef と \ifx の例で \edef ではなく \def を用いると、最後の一つが diff になる。
\ifthenelse は {} を与えると \string が上手く動かないので、sh のようにダミーの x を頭に加えて空文字列の場合 x になるようにしている。
また
\edef\xNext{\ifeqstr{foo}{\foo}{same}{diff}} \xNextようなことをした場合、
\edef, \ifx は 2 行目で、
! Missing control sequence inserted. <inserted text> \inaccessible l.59 \xNext ?\ifthenelse は 1 行目で
! Undefined control sequence. <argument> \equal {\string xfoo}{\string x\foo } l.81 \edef\xNext{\ifeqstr{foo}{\foo}{same}{diff} } ?のようなエラーになる。
どちらも \noexpand を使って
\edef\xNext{\noexpand\ifeqstr{foo}{\foo}{same}{diff}} \xNextとしておけば same を得るが、やっぱりマクロのこういう所は地味に辛い。
他にも、
expl3 パッケージで \strcompare 作る方法とか、
pdftexcmds パッケージの \pdf@strcmp 使う方法とかもあるらしい。
参考:
- StackExchange / {TeX}
- 2014-08-08: ifthenelse equal string comparison fails
- 2016-04-26: How do I perform an expandable string comparison?
marksheet.sty で section 毎に回答欄のラベル付けをしたくて、
\ref{} の結果で \ref{} する、つまり \ref{\ref{A}:\ref{B}} みたいな事をしようと思ったんだけど、
これが困難を極めた。
\expandafter, \noexpand, \unexpanded 及び \edef を駆使すると出来るかなと一瞬思ったんだけど結論から言うと挫折した。
黒魔術度高くて辛い orz
結局、\ref{sec\arabic{section}:hoge} みたいな感じでお茶を濁したんだが、
今後の検討課題かもしれない。
参考:
\ref{} の結果で \ref{} する、つまり \ref{\ref{A}:\ref{B}} みたいな事をしようと思ったんだけど、
これが困難を極めた。
\expandafter, \noexpand, \unexpanded 及び \edef を駆使すると出来るかなと一瞬思ったんだけど結論から言うと挫折した。
黒魔術度高くて辛い orz
結局、\ref{sec\arabic{section}:hoge} みたいな感じでお茶を濁したんだが、
今後の検討課題かもしれない。
参考:
- Qiita / zr_tex8r
- 2016-12-25: 徹底解説! \expandafter 活用術(キホン編)
- 2017-01-09: 徹底解説! \expandafter 活用術(ホンキ編)
タグ
コメントをかく