LaTeX Tips

$Id: tips.html,v 1.5 2024/12/07 15:49:34 daichi Exp $
LaTeXデフォルトのベクトルの矢印が短い
\usepackage[e]{esvect} を使う
画像ファイル名に複数のピリオドがあるとincludegraphicsがエラー
\usepackage{grffile} を入れる
複数行にわたる下線を入れる
\usepackage{jumoline}を使う. \setlength{\UnderlineDepth}{2.6pt} とするとよい.
\def\ul#1{\Underline{#1}} として定義しておく
上の\ulで, \ul{...}の中に数式番号の参照があるとLaTeXがエラー
\eqref部分を {} で囲う (例: ほげほげ{\eqref{eqn:foo}}.)
Indexで参照が see になってしまう
\renewcommand{\seename}{→}
「マス」を表す\boxslashを使いたい
\usepackage{stmaryrd} を入れる
\begin{cases}..\end{cases}だと括弧の大きさが変
\usepackage{empheq}してから, 以下のように wrap, wrap* 環境を定義する
\newenvironment{wrap}%
{\empheq[left={\empheqlbrace\,}]{align}}{\endempheq}
\newenvironment{wrap*}%
{\empheq[left={\empheqlbrace\,}]{align*}}{\endempheq}
分数の真ん中の線が短すぎる
次のようにして \frac を再定義
\makeatletter
\let\originalfrac=\frac
\DeclareRobustCommand{\ffrac}[2]{%
\originalfrac{\kern1.5pt{#1}\kern1.5pt}{\kern1.5pt{#2}\kern1.5pt}} 
\let\frac=\ffrac
\makeatother
minipageの中で \vv がエラー, 図のcaptionの中で \vv がエラー
$\protect\vv{..}$ とする. \protect$\vv{..}$ は無意味.
\captionの中で\footnotemarkがエラー
同様に{\protect\footnotemark}のようにする.
表のセルの中で改行を行いたい
\parboxを使う. \parbox[c]{幅}{\noindent ...} で幅指定のboxが作れる.
改行幅が大きいので調整し, 箱の上下に余裕を持たせるために, さらに次のように指定する.
 \parbox[c]{5em}{\baselineskip=0.7\baselineskip\rule{0pt}{1.1em}\noindent
 That is a very long paragraph.%
 \rule[-7pt]{0pt}{1em}}
次のように, \cellboxを定義しておくと便利.
\def\cellbox#1#2{%
\parbox[c]{#1}{\baselineskip=0.7\baselineskip\rule{0pt}{1.1em}\noindent
#2\rule[-7pt]{0pt}{1em}}}
画像などにグラデーションのかかった影を落とす& その際に周りの余計なスペースを0にする
psblurboxを使う. PSTricksを使っているため, 基本的にdvipsでないと動かないはずだが, zrbabbler氏作の bxdpx-pstricks.sty を使うとdvipdfmxでも使える.
(https://zrbabbler.hatenablog.com/entry/20140712/1405179775) 次のようにする.
\usepackage[dvipdfmx]{graphicx}
\usepackage[dvipdfmx]{bxdpx-pstricks}
\usepackage{pst-blur}
\psblurbox*[framesep=0pt]{\includegraphics{hogehoge}}
本来的な解決はTikzのpgf-blurを使うことだが.. .
\ddots, \vdotsなど…系の省略の大きさが変更できない
\usepackage{mathdots}を入れる. ドキュメントはこちら.
\vdotsの点を4つにしたい
次のように\:を定義
\def\:{\parbox[c]{.5ex}{:\\[-2ex]:}}
段落の入ったboxを\fbox, \shadowboxなどで囲えない
\usepackage{cprotect}してから, \cprotect\shadowbox{..} のようにする.
verbatim環境を入れたい場合は, \usepackage{verbatimbox}してから \begin{verbbox}..\end{verbbox} とする.
図を垂直方向に中心に配置したい (表の中など)
\usepackage{graphbox} を入れておくと, \includegraphics[align=c] というオプションが使える
\usepackage{diagbox}すると, 図の挿入がエラー
diagboxが依存しているpict2eがドライバ依存なので, 文書全体のプレアンブルに \documentclass[..,dvipdfmx]{jbook} のように dvipdfmx を追加.
algorithm環境のキャプションで, 上にも線が入るのがうざい
これは @algocf@pre@ruled で定義されているので, 次のようにして{}に定義する.
\makeatletter
 \def\@algocf@pre@ruled{}
\makeatother
algorithm環境 (algorithm2e)で, キャプションのフォントを小さくする. また, 下に少し空白を空ける.
次のように定義する.
\SetAlCapFnt{\small}
\SetAlCapNameFnt{\small}
\SetAlgorithmName{アルゴリズム\rule[-3pt]{0pt}{1ex}}{アルゴリズム}{アルゴリズムの一覧}
algorithm環境で, コメントの頭を揃えたい.
\eqparbox{}を使う解法だと, 頭が揃わない右揃えになってしまう. \usepackage{algorithmic}の代わりに \usepackage[noend]{algcompatible} としてから, 次のように定義する. 使う際は, \FORの場合も常に \COMMENT{ほげ} とする.
\renewcommand{\COMMENT}[2][.5\linewidth]{%
  \leavevmode\hfill\makebox[#1][l]{(*~#2~*)}}
Box中などで \footnotemark..\footnotetext を使う場合, 複数入れると番号がずれる
次のように定義して, \fnm, \fnt を使う
\newcounter{footnotemarknum}
\newcommand{\fnm}{\addtocounter{footnotemarknum}{1}\footnotemark} 
\newcommand{\fnt}[1]{
    \addtocounter{footnote}{-\value{footnotemarknum}}
    \addtocounter{footnote}{1}
    \footnotetext{#1}
    \setcounter{footnotemarknum}{0}
}
使い方: \footnote{text1} \fnm \fnm .. \fnt{text2} \fnt{text3}
こうして, 通常の \footnote と併用もできる.
索引をあかさたな順に分けたい
% mendex -d mendex.dic -s mendex.isty -g textmodel.idx でmendexのスタイルファイル mendex.isty が読み込めるので, 中に下のように書いておく. -g はあいうえおではなく, あかさたな順にするオプション.
symbol_flag  0           # 最初に "Symbols" を置かない (効かなかった)
letter_head  2           # カタカナではなく, ひらがなで分ける
lethead_flag 1           # 索引を頭文字で分ける
lethead_prefix	"{\\bf " # 頭文字をボールドにする
lethead_suffix	"}"      # 同様
symhead_positive "記号, 数字" # "Symbols"を"記号, 数字"にする
TUGのmendexのマニュアルはこちら.
「公式の一覧」のように独自の一覧を作りたい.
パッケージtocloftを使って, 次のように指定する. 数式の中なので, \parがあるとエラー.
\newcommand{\listformulaname}{\huge\bf 公式の一覧}
\newlistof{formulae}{equ}{\listformulaname}
\newcommand{\formula}[1]{%
 \text{({\bf #1})}%
 \addcontentsline{equ}{formulae}{\protect\numberline{(\theequation)}~#1}
}
\setlength{\cftformulaenumwidth}{3em}
こうしてから, align環境の第3引数を使って & & \formula{プハの公式} のように指定する.
そのままでは Command \c@lofdepth already defined. と怒られるので, \usepackage[subfigure]{tocloft} として[subfigure]を入れてtocloftをロードする.
反対を表すとき, \leftrightarrowは短すぎるし, \longleftrightarrowは長すぎる.
extarrowsパッケージを読み込んで, 次のように定義する. 2exのところは調整可能. raiseboxは和文の高さと合わせるためのもの.
\def\←→{\raisebox{0.3ex}{$\xleftrightarrow{\rule{2ex}{0pt}}$}}
行列の列間の空白を変えたい
amsmathを使っている場合は pmatrix, bmatrix を使うことになるが, \arraycolsep を変えればよい. 該当の \begin{align}などの中で指定してもよい.
{\arraycolsep=0pt
 \begin{pmatrix}
  ...
 \end{pmatrix}
}
数式内の要素を, 微妙に上下したい
\raise2pt\theta などはエラーになる. \raise2pt\hbox{$\theta$} として \hboxで囲むとうまく働くようになる (\raiseboxを使えば同じという話もあるが..).
表の中の表の垂直合わせ.
tabularの中にtabularを入れると, 中身は基本的に中心合わせになる. 改行の調整等で基準線を下に合わせたい場合は, tabular中のtabularの方に \begin{tabular}[b]{lll} などと[b]のように指定する.
脚注の長いURLで, 適度に改行を入れたい
\usepackage{xurl}してから\url{http://...}で終わり..だが,
\usepackage{url}や\usepackage{xurl}が動かないことがあった. こういう場合は, {\linebreak[4]}や{\linebreak[3]}などを適宜入れておくとよい. \linebreak[4]はその場所で必ず改行する. 数(0〜4)が小さいほど, 制限が緩まる. \linebreakを短く\defしておいてもよい.
\Cvsとは?
\sectionの定義等で使われている\Cvsは, 基準となる\baselineskipのこと, つまり \normalsizeでの\baselineskipに等しい, とのこと. (https://ftp.unpad.ac.id/ctan/macros/jptex/latex/platex/pldoc.pdfより)
章末の練習問題用などに新しいenumerateを定義したい
enumitemパッケージをロードしてから, 次のようにして新しい環境 exercises を定義する. 後は \begin{exercises} \item .. \end{exercises} でよい. 数字はリストの最大の深さ.
\newlist{exercises}{enumerate}{1}
\setlist[exercises]{
 itemsep=2pt,
 label={[\thechapter--\arabic*]},
 ref={\thechapter--\arabic*}
}
表の中で\parboxを使う場合
そのままでは中心で揃うので, 改行の調整がうまくいかない. \parbox[b]{5zw}{...} などとして, 下に揃える. \parboxのオプションには他に \parbox[position][height][inner-pos]{width}{text} があり, 詳しくはTUGの \parboxの解説 にある.
表で中央寄せ, かつ幅が固定のカラムを使いたい
m{1zw}などは垂直方向にしか中央寄せできないので, 下記のようにして新しい指定子C,Wを定義して, {CCCC}のようにする. Wの方はW{2zw}のようにして幅を適宜指定して使う. 参考: https://tex.stackexchange.com/questions/12703/how-to-create-fixed-width-table-columns-with-text-raggedright-centered-raggedlef
\usepackage{array}
\newcolumntype{C}{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{4em}}
\newcolumntype{W}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
表で固定幅, かつ右寄せ(数字など)のカラムを使いたい
以下のようにして指定子Rを定義する. 右が揃う=左は揃わない, なので\raggedleftなのに注意. R{2em}のようにして使う.
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1}}
\underbraceの下のテキストを\footnotesizeにしたい
\underbrace{}_{\textstyle ..} とするのが定番だが, これだと\normalsizeになってしまう. \footnotesizeにするには, \text{}で囲って \underbrace{}_{\text{\footnotesize ..}} とする必要がある. 次のように \fnstyle を定義しておくと便利.
\def\fnstyle#1{\text{\footnotesize #1}}
バックスラッシュ\をキャプションなどでタイプライター体で出せない
\textbackslashとすると, たとえ\ttで囲っていても普通のフォントになってしまう. Plain TeXの記法で, {\tt \char`\\} とすると出すことができる.
latexmkで ".fdb_latexmk" といううざい名前のファイルができる
latexmkは便利なツールですが, データベースファイルの上記の拡張子は目立ちすぎるため,
$fdb_ext = 'fdb';
を ~/.latexmkrc の中に入れておけば, ${target}.fdb にデータベースが構築されるようになる.
$y$のように下に突き出た深さだけを潰したい
$\smash[b]{y}$ とする. \smashは高さと深さの両方を0にするが, \smash[t]だと高さだけ, \smash[b]だと深さだけを0にする.
数式を複数の位置で揃えたい.
amsmathの alignat, または alignedat を使う. \begin{aligned}{n} で, nは揃える数. &はこの2倍必要で, "奇数個目の&でだけ揃う"点に注意. 偶数個目は説明などを入れるタブの機能があるが, 空白は入らない. 下の例を参照.
\begin{aligned}{3}
 & p(\vz_1^N\|\balpha) &~
 &&= \prod_{i=1}^N & \left[
      \frac{\Gamma({\sum}_k\alpha_k)}{\Gamma(T_i\+{\sum}_k\alpha_k)}
      \prod_{k=1}^K \frac{\Gamma(\alpha_k\+n(i,k))}{\Gamma(\alpha_k)}
     \right]
 \\
 & p(\vw_1^N\|\vz_1^N,\bmeta) &~
 &&= \prod_{k=1}^K & \left[
      \frac{\Gamma(V\eta)}{\Gamma(V\eta+m(k))}
      \prod_{v=1}^V \frac{\Gamma(\eta\+m(k,v))}{\Gamma(\eta)}
     \right]
\end{aligned}
文献で, 指定した場所で改行可能にしたい
/の場合は{\slash}とすればよいが, それ以外の場合は, \hspace{0pt}をその場所に挿入する. \mbox{}は効かないので注意.
TeX Live2020以降のLaTeXで, 表の中での\inputの後の\hlineがエラー
表の中身を\inputで外部ファイルにしたいことはよくあるが, TeX Live 2020以降では \inputでファイルの中身を取り込んだ後にフックが実行されるため, \hline のところでエラーが出てしまう.
これを解決するには, 次のようにして \einput を定義して使えばよいとのこと. 参照: https://tex.stackexchange.com/questions/583927/misplaced-noalign-error-with-input-in-a-table-after-the-2020-fall-latex-releas
\makeatletter
 \let\einput\@@input
\makeatother
ただし, こうすると2020以前のLaTeXでは逆にエラーになってしまうため, 両方に対応するには \def\einput#1{\input{#1}} として, コメントアウトで切り替えるようにする.

daichi
Last modified: Wed Dec 11 01:17:07 2024