hack のためのネタ帳, etc,,,

Tips

一般的なのは slashbox パッケージを使う方法らしい。
\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);}
みたいにすれば良いらしい。
ただし、座標は出力を見ながら手動で調整する必要があるので、地味な面倒臭さがある。

参考:
関連:
\onecolumn, \twocolumn[2段組み前の1段組み部分] で自動的に改ページして切り替え出来る模様。
2段組み時には \newpage は段区切り相当になる。

多段組にする場合、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}
のような方法もあるようだ。

参考:
地味に面倒臭かった。 等々によると、
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 使う方法とかもあるらしい。

参考:
marksheet.sty で section 毎に回答欄のラベル付けをしたくて、
\ref{} の結果で \ref{} する、つまり \ref{\ref{A}:\ref{B}} みたいな事をしようと思ったんだけど、
これが困難を極めた。

\expandafter, \noexpand, \unexpanded 及び \edef を駆使すると出来るかなと一瞬思ったんだけど結論から言うと挫折した。
黒魔術度高くて辛い orz

結局、\ref{sec\arabic{section}:hoge} みたいな感じでお茶を濁したんだが、
今後の検討課題かもしれない。

参考:

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます