ユーザ用ツール

サイト用ツール


メモ:latex

Latex関係のメモ

RmarkdownからLatexを経由してPDFを作成する際に必要でしらべたLatexのTips。本格的にちゃんと勉強したいが。。

主に困ったのが、余白関係。美しく組版するという目的からか、標準ではかなり余白が多めで図表を詰め込んだりできない。それらを解消する方法をまとめておく。スマートな方法とは言えない。また、直接Latexを書くわけではなく、Rmarkdownから制御しなければならないため、細かい指示ができない場合もあり、もどかしい。。

図表番号を節ごとに

詳細は追って調べる。 図表番号の区切り文字は「.」となる。それぞれの真ん中の行でフォーマットを設定しているので、これをいじれば好きなフォーマットで「図1-3」などに変更できる。

\makeatletter

\renewcommand{\theequation}{% 式番号の付け方
\thesection.\arabic{equation}}
\@addtoreset{equation}{section}

\renewcommand{\thefigure}{% 図番号の付け方
\thesection.\arabic{figure}}
\@addtoreset{figure}{section}

\renewcommand{\thetable}{% 表番号の付け方
\thesection.\arabic{table}}
\@addtoreset{table}{section}

\makeatother

改ページ

# とにかく改ページ。
\newpage

# 未配置の図表を出力して改ページ
\clearpage

余白

図と図の間などの余白。どれが効いているのかを調べる方法がよくわからない。色々調整してみて、反応するものをみて予想をつけた。

# 図と図の間
\setlength\floatsep{0pt}

# 本文と図の間
\setlength\textfloatsep{0pt}

# 本文の図
\setlength\intextsep{0pt}

# 図とキャプションの間
\setlength\abovecaptionskip{0pt}

Rmarkdown側のプリアンプルで定義すると、全ての図表に影響してまう。特定の場所に設定するには、

{
\setlength\abovecaptionskip{0pt}
図1
図2
}

のように中カッコでくくる必要があるが、Rmarkdownの本文中で中カッコを書いても、途中でエスケープされて、Latex的には文字としての中カッコがPDFに出力される。苦肉の策としてマクロを利用する方法を思いついた。

\newcommand{\setmargin}[1]{{\setlength\intextsep{4mm}#1}}
\setmargin{
図1
図2
}

こうすると、中カッコが単独で本文中に現れないので、特定範囲の図だけを対象に余白を調整できる。

図表とキャプションの間隔

図や表とキャプションとの間隔を決める。標準ではちょっと広すぎる場合がある。

 \usepackage{caption}

\captionsetup[table]{skip=10pt}
\captionsetup[figure]{skip=10pt}

1ページあたりの図表の数

図表の余白を小さくしたり図自体を小さくしても、妙に余白ばかり大きくなって1ページあたりに図がつめこめなかったが、Latexでは図の配置は自動的に決められることが原則であるため、そのパラメータにひっかって思うように動かなかった。うまく組み立てれば洗練された文書を作れるが、やはり見た目から逆算することも多い。

主に引っかかっていたと思われる制限は、1ページ当たりのテキストの最小割合や1ページ当たりのfloat数など。これらを調整すると、図表を詰め込むことができる。

# ページ上部に入れられるfloatの数
\setcounter{topnumber}{2}

# 2段組みの場合
\setcounter{dbltopnumber}{2} % twocolumn時の⾴上部の最⼤float数

# ページ下部に入れられるfloatの数
\setcounter{bottomnumber}{1}

# 1ページの最大float数
\setcounter{totalnumber}{3}

# ページ上部のfloatの最大割合
\renewcommand\topfraction{.7}

# 2段組みの場合
\renewcommand\dbltopfraction{.7}

# ページ下部のfloatの最大割合
\renewcommand\bottomfraction{.3}

# 1ページあたりのテキスト部分の最小割合
\renewcommand\textfraction{.2}

# floatだけのページの最小割合
\renewcommand\floatpagefraction{.5}

# 2段組みの場合
\renewcommand\dblfloatpagefraction{.5}  

floatのみのページの図表配置

図だけのページの配置は専用のパラメータが設定されている。前のページから押し出されて図がはみ出し、次のページに図が1枚だけになってしまった場合など。図に続いて文字などがあると図は上詰めで配置されていくが、文書の最後やclearpageなどで残った図を張り付けてから改ページが行われる場合などに起こることが多い気がする。

標準では以下の設定になっているようだ。

\@fptop = 0pt + 1fil
\@fpsep = 8pt + 2fil
\@fpbot = 0pt + 1fil

@fptopはフロートのみのページの上部の余白。余白は0だが1filでページの上側が伸び縮する予約で調整される。下の予約や図と図の間の余白との関係で相対的に決まる。標準では@fpbotも同じ設定なので、上下均等に余白が作られる。したがって、全体として図が縦方向の中央に配置される。上詰めしたければ@fptopを0ptのみにすれば、下の伸縮可能な余白が上まで上がってきて、上詰めになる。

@fpsepは図が2枚以上ある場合の図と図の間の配置設定。標準だと、図と図の間の余白が2filなので、相対的にやや広くなって全体に均等に配置されるようだ。すべての図を上詰めにするなら、@fpsepも2filを取り除けばよい。0ptにすると図と図の間隔が狭くなりすぎるため、必要に応じて適宜調整。

文書全体で調整するにはプリアンブルに以下を追加する。

\makeatletter
\setlength{\@fptop}{0pt}
\setlength{\@fpsep}{8pt}
\setlength{\@fpbot}{0pt plus 1fil}
\makeatother

見出しの余白

詳細はもう少し調査。見出し、小見出しの上下の余白を調整。

\usepackage[compact]{titlesec}

# 「*」があるとタイトルに続く段落のインデントを削除する
\titlespacing*{\section}{0pt}{*0}{0pt}
\titlespacing*{\subsection}{0pt}{*0}{0pt}

\titlespacing{\section}{タイトル左のインデント}{上のスペース}{下のスペース}
\titlespacing{\subsection}{0pt}{*0}{0pt}

少し調べたので追加。

「\titlespacing*」のアスタリスク付きコマンドは、タイトルに続くパラグラフのインデントを削除するかどうか。アスタリスク付きのコマンドは続くパラグラフの冒頭のインデントを削除する。ただしRmarkdownから使う場合はインデントの設定が通常のLatexとは異なるようで、アスタリスク付きでも無しでも変わらない。pandocが呼び出すテンプレートやインデントの設定が関係しているようだ。時間があるときに調べよう。

数値は、絶対値と相対値が指定できる。括弧内の数値の前の「*」は省略した記法で、基準となる単位の倍数を意味するようだ。Latexの相対的な数値の指定方法はまだ理解不足。

ページの余白

しばしば見かけるのは、geometryを利用するものだが、Rmarkdownからxelatexを使う場合、geometryがうまく機能せずエラーになる。そこで、以下のようにしてページの余白を調整。意味はもう少し調査。

\setpagelayout * {margin=20mm}

行間

標準のスタイルでは行間もかなり広い。論文や雑誌記事ならよいが、ワープロ的に使うにはちょっと広すぎる。

\renewcommand{\baselinestretch}{0.9}

ページの一部だけを対象にする場合は

\begin{spacing}{倍率}
文章文章文章文章文章
\end{spacing} 

ページレイアウトの確認

ページのレイアウト情報の確認には、layoutパッケージを用いる。

プリアンブルでパッケージを読み込む

\usepackage{layout}

レイアウト情報を出力したい箇所にコマンドを挿入

\layout

レイアウト情報が可視化された図が出力される。

表の行間の余白

標準では表の行間に微妙な余白が入る。通常はスッキリした見栄えになるが、余白をなくしたい場合もある。

余白をなくすには以下のように\aboverluesepと\belowrulesepを書き換えるマクロを作成し、必要に応じて利用する。直接これらの値を変更してもよいだろう。

\newcommand{\midsepremove}{\aboverulesep = 0mm \belowrulesep = 0mm}
\newcommand{\midsepdefault}{\aboverulesep = 0.605mm \belowrulesep = 0.984mm}

\midsepremove
\midsepdefault

丸囲み数字等のフォント

Rmarkdownからxelatexを経由してPDFを作成する際に、丸囲み数字など(①)がフォント抜けで豆腐になっていたのを解決。問題は単純なフォント設定だったが、フォント設定は基本的に変えたくなかったので、いろいろ調査してわかったこと。

xelatexはTTFフォントを直接指定することができる便利なtexなので、Rmarkdownからの出力はこれを利用している。この時、日本語を利用するために以下の設定をしている。ドキュメントクラスの読み込みでfontspecやzxjatypeはusepackageをしなくてもよいかもしれない。

RmakdownのYAMLヘッダ(該当箇所のみ)

documentclass: bxjsarticle
classoption: xelatex,ja=standard,base=10.5pt,jbase=10.5pt,a4paper
header-includes:
  # 欧文フォントの指定
  - \usepackage{fontspec}
  - \setmainfont{Times New Roman}
  - \setsansfont{Times New Roman}
  # 和文フォントの指定
  - \usepackage{zxjatype}
  - \setCJKmainfont[BoldFont=IPAexGothic]{IPAexMincho}
  - \setCJKsansfont{IPAexGothic}

Texソースでは以下のように展開される。

\documentclass[xelatex,ja=standard,base=10.5pt,jbase=10.5pt,a4paper]{bxjsarticle}
\setmainfont{Century}
\setsansfont{Century}
\setCJKmainfont[BoldFont=IPAexGothic]{IPAexMincho}
\setCJKsansfont{IPAexMincho}

使っているフォントはともかくとして、以上の設定でだいたいスムーズにタイプセットしてPDFがうまく生成されていたのだが、丸囲み数字などがフォント抜けしてしまい、その都度丸囲み数字を生成するコードを挿入していた。文章を書いている場合には、自分で丸囲み数字を使う箇所を認識しているので問題はないが、アンケートの自由記述欄などテキストデータを読み込んで、一括して整形・出力するようなコードを書くと、どうしても入力された文字に混ざってしまう。逐一見つけて置換などをしても、気づかないフォント抜けなどが発生してしまうことがあり、いままで気づいた文字を置換リストに貯めていたが、非効率だしユニコードの世界では解決できるはずだと思い調査。

原因は非常に単純な点にあった。問題は、丸囲み数字の箇所が「欧文」として扱われており、Times New Romanにコードポイントに対応するフォントが用意されておらず、フォントが抜けてしまう様だった。試しに欧文フォントをIPAフォントに変えてみると、ごく普通に丸囲み数字もPDFで表示できる。丸囲み数字を入力するのが日本語IMEで変換するため、てっきり日本語の全角文字扱いだと思っていたが、かつてと異なりユニコードでは①はU+2460というコードポイントが割り当てられており、このコードが入力されている。そして、このコードがある範囲がxelatexでは欧文として扱われるため、欧文フォントの設定が適用されていたためにフォント抜けが発生していた。

単純な解決策は、欧文もすべて日本語フォントにすること。IPAex明朝などは、半角文字もきれいに出力できるので、これはこれでよい。しかし、どうしてお欧文には別フォントを利用したい場合、丸囲み数字の箇所だけフォント指定するとか、段落単位で逐一フォント指定するとか個別対応が必要となる。これでは、個別に置換するのと手間はあまり変わらない。そこで以下を参考に設定を追加。

\xeCJKDeclareSubCJKBlock{kigou}{"20A0 -> "2BFF}

上記のように、xeCJKパッケージの\xeCJKDeclareSubCJKBlockで、和文として扱うコードの範囲を指定してやる。単純に和文として扱うだけなら、上記のように必要な個所のコードを指定すれば、全体で設定している和文フォントが利用される。「kana」は識別名なので何でもよい。範囲の指定は、コードポイントでも、コードポイントに対応する文字でも指定できるようだ。また、必要に応じてここで指定したブロックだけ別フォントを割り当てることも可能。ここでは横着して、とりあえずASCII文字+α以上のコードポイントはすべて和文と指定して丸囲み数字等をすべて日本語フォントにしてしまうが、もう少し丁寧に設定する方が望ましいだろう。範囲指定の際は、Unicodeのブロック表などを参照するとよい。

\xeCJKDeclareSubCJKBlockでASCII以外のほぼすべてのコードポイントを指定していたが、やはり横着したのはよくなかった。詳細は調べていないが、ここで指定されたブロックは、文字送りや禁則処理のルールが別扱いになるようで、「。」が行頭に出てしまったりと、美しい組版にあらない。ということで、記号が入っているブロックに絞って指定する。とりあえず「“20A0 → “2BFF」の範囲としたが、様子を見て微調整する。とりあえず丸囲み数字の範囲は抑えているので、当面は問題ないはず。

メモ/latex.txt · 最終更新: 2021/10/07 10:24 by Wiki Editor