注意 当サイトは、Typst v0.12.0 公式ドキュメントを、日本語コミュニティが非公式に翻訳したものです。誤訳・未訳・古い情報が含まれている可能性があるため、公式ドキュメント との併用を推奨します。このサイトの内容に誤りを発見された方は、GitHubリポジトリまでご報告を頂けましたら幸いです。我々のコミュニティにご興味のある方は、ぜひ非公式Discordサーバー「くみはんクラブ」にご参加ください。
Warning: This site provides an unofficial translation of the Typst v0.12.0 documentation by the Japanese Community. Please note that there may be some inaccuracies, untranslated sections or outdated information. We highly recommend referring to the latest official documentation as well. If you find any errors in the content, please let us know through our GitHub repository. If you are interested in our community, feel free to join our unofficial Discord server, “Kumihan Club.”
Typst ドキュメント日本語版

高度なスタイリング

このチュートリアルの前の2つの章では、Typstで文書を書く方法とその書式を変更する方法を学びました。 それらの章を通して書いたレポートが優れた評価を得たため、指導教員はそれを基に学会論文を書いてほしいと考えています! もちろん、論文は学会のスタイルガイドに従わなければなりません。 どうすればそれを達成できるか見てみましょう。

始める前に、チームを作成して、そのチームに教員を招待して追加しましょう。 まず、エディターの左上にある戻るアイコンでアプリのダッシュボードに戻ります。 次に、左のツールバーのプラスアイコンを選択し、チームを作成します。 最後に、新しいチームをクリックし、チーム名の横にあるmanage teamをクリックして設定に進みます。 これで教員をメールで招待することができます。

The team settings

次に、プロジェクトをチームに移動します。 プロジェクトを開き、左のツールバーの歯車アイコンを選んで設定に行き、Ownerのドロップダウンから新しいチームを選択します。 変更を保存するのを忘れないでください!

あなたの教員もプロジェクトを編集することができ、お互いにリアルタイムで変更を確認できます。 公式のDiscordサーバーに参加して他のユーザーを見つけ、一緒にチームを組んでみることも可能です!

学会ガイドライン

レイアウトのガイドラインは学会ウェブサイトに掲載されております。 ここでは以下の条件であった場合を考えましょう。

これらのうち、多くの項目については既に対応方法を知っていますが、いくつかについては新しい記法を学ぶ必要があります。

setルール

まず、文書のsetルールを書くことから始めましょう。

#set page(
  paper: "us-letter",
  header: align(right)[
    A fluid dynamic model for
    glacier flow
  ],
  numbering: "1",
)
#set par(justify: true)
#set text(
  font: "Libertinus Serif",
  size: 11pt,
)

#lorem(600)
Preview

ここで行われていることの大半は、すでに分かりでしょう。 テキストサイズを11ptに、フォントをLibertinus Serifに設定しています。 また、段落の両端揃えを有効にし、ページサイズをUSレターとしています。

ここで、headerは新しい引数で、各ページの上部の余白に置くコンテンツを設定できます。 ヘッダーには、学会のスタイルガイドで要求されているように、論文のタイトルを指定します。 align関数を用いてそのテキストを右寄せにします。

最後に numbering 引数について説明します。 ここでは、ページ番号の付け方を定義するnumbering patternを指定できます。 例えば"1"と設定すると、Typstは素のページ番号のみを表示します。 また"(1/1)"と設定すると、カッコで囲まれた現在のページと総ページ数が表示されるでしょう。 さらに、カスタム関数を用意して完全に好みの書式にすることも可能です。

タイトルとアブストラクトの作成

それでは、タイトルとアブストラクトを追加しましょう。 まずはタイトルを中央揃えにし、*stars*で囲んでフォントを太文字にします。

#align(center, text(17pt)[
  *A fluid dynamic model
  for glacier flow*
])
Preview

正しく動作していることが確認できます。 text関数を使って、前のテキストのsetルールをローカルで上書きし、関数の引数で文字サイズを17ptに大きくしました。 次に、著者リストも追加しましょう。 指導教員と一緒にこの論文を書いているため、自分の名前と教員の名前を追加します。

#grid(
  columns: (1fr, 1fr),
  align(center)[
    Therese Tungsten \
    Artos Institute \
    #link("mailto:tung@artos.edu")
  ],
  align(center)[
    Dr. John Doe \
    Artos Institute \
    #link("mailto:doe@artos.edu")
  ]
)
Preview

著者情報が記載された2つのブロックが隣り合わせにレイアウトされています。 このレイアウトを作るためにgrid関数を使っています。 これにより、各列の大きさや、どのコンテンツをどのセルに入れるかを正確に制御することができます。 columns引数には、相対長さまたは割合の配列を渡します。 この場合、2つの等しい割合のサイズを渡し、使用可能なスペースを2つの等しい列に分割するように指示します。 次に、grid関数に2つの内容引数を渡しました。 ひとつは主著者であるあなたの情報で、もうひとつは指導教員の情報です。 ここでも align 関数を使用して、コンテンツを列の中央に配置しています。 grid関数はセルを指定するcontent引数を任意の数で受け取れます。 行は自動的に追加されますが、rows引数で手動でサイズを指定することも可能です。

それでは、アブストラクトを追加しましょう。 学会は、アブストラクトを中央に配置することを望んでいることを忘れないでください。

...

#align(center)[
  #set par(justify: false)
  *Abstract* \
  #lorem(80)
]
Preview

できました!特筆すべき点は、alignのcontent引数の中にあるsetルールを使って、アブストラクトの両端揃えをオフにしたことです。 これは、最初のsetルールの後に指定されたにもかかわらず、文書の残りの部分には影響しません。 コンテンツ・ブロック内で設定されたものは、そのブロック内のコンテンツにのみ影響します。

ヘッダーとタイトルの2回入力する必要がないように、論文タイトルを変数に保存することも可能です。 変数の宣言にはletを使用します。

#let title = [
  A fluid dynamic model
  for glacier flow
]

...

#set page(
  header: align(
    right + horizon,
    title
  ),
  ...
)

#align(center, text(17pt)[
  *#title*
])

...

Preview

title変数にコンテンツを設定した後は、関数内やマークアップ内(関数のように接頭辞に#をつける)で使用できます。 こうすることで、別のタイトルに決めた場合、一箇所で簡単に変更することができます。

段組みと見出しの追加

上の論文は、残念ながら文字が単調にぎっしり詰まっていて読みにくい見た目をしています。 これを修正するために、見出しを追加し、2段組のレイアウトに変更してみましょう。 幸いなことに、setルールでpagecolumn引数を追加することで簡単に行えます。

引数リストにcolumns: 2を加えることで、文書全体を2段組みとなります。 しかし、これではタイトルと著者、アブストラクトにも影響が出てしまいます。 それらを1段組みのままに維持するためには、place関数を呼び出して囲みましょう。 place関数は引数として配置とコンテンツを受け取ります。 オプション引数であるscope引数を使えば、現在の段組みとその親(ページ)のどちらに対して配置するかを決めることが可能です。 これらに加えて、もうひとつ設定することがあります。 オプション引数がない場合、placeはそのコンテンツを文書の流れから外し、他のレイアウトに影響を与えることなく、他のコンテンツの上に配置します。

#place(
  top + center,
  rect(fill: black),
)
#lorem(30)
Preview

もしここでplaceを使わなければ、黒塗りの長方形は独立した行になるはずですが、 placeを使うと、それに続く数行のテキストの上に重なります。 同様に、テキスト側もこの長方形がないかのように振る舞います。 この動作を変更するには、引数float: trueを渡してください。 これによりplaceでページの上部または下部に配置されたアイテムが、他のコンテンツと重ならないように設定できます。

#set page(
  paper: "us-letter",
  header: align(
    right + horizon,
    title
  ),
  numbering: "1",
  columns: 2,
)

#place(
  top + center,
  float: true,
  scope: "parent",
  clearance: 2em,
)[
  ...

  #par(justify: false)[
    *Abstract* \
    #lorem(80)
  ]
]

= Introduction
#lorem(300)

= Related Work
#lorem(200)
Preview

この例では、place 関数の clearance 引数も使用しています。 これにより、v関数を使用する代わりに、本文との間にスペースを設けています。 また、コンテンツはcenter引数を継承しているため、各パーツごとに行っていた明示的な align(center, ...) 呼び出しも削除できます。

最後に見出しのスタイルの設定をしましょう。 ガイドラインに従うために、見出しは中央揃えにして、小さな大文字を使わなければなりません。 heading関数はそのような設定を提供していないため、独自の見出しshowルールを書く必要があります。

#show heading: it => [
  #set align(center)
  #set text(13pt, weight: "regular")
  #block(smallcaps(it.body))
]

...
Preview

うまくできました! すべての見出しに適用されるshowルールを使用しました。 この関数にパラメータとして見出しを渡します。 このパラメータはコンテンツとして使用することもできますが、titlenumberslevelといったフィールドも持っているため、そこから独自の書式を構成することも可能です。 ここではセンター揃えにし、見出しはデフォルトで太字なのでフォントのウェイトを "regular" に設定し、smallcaps 関数を使って見出しのタイトルを小さな大文字でレンダリングしています。

残る唯一の問題は、すべての見出しが同じように見えることです。 MotivationとProblem Statementはサブセクションであり、イタリック体であるべきですが、今はセクションの見出しと見分けがつきません。 この問題は、setルールにwhereセレクターを使うことで解決できます。 これは、見出し(および他の要素)に対して呼び出せるメソッドで、レベルごとにフィルタリングすることが可能です。 これによりセクションとサブセクションの見出しを区別できます。

#show heading.where(
  level: 1
): it => block(width: 100%)[
  #set align(center)
  #set text(13pt, weight: "regular")
  #smallcaps(it.body)
]

#show heading.where(
  level: 2
): it => text(
  size: 11pt,
  weight: "regular",
  style: "italic",
  it.body + [.],
)
Preview

これは素晴らしい! 第1レベルと第2レベルの見出しにそれぞれ選択的に適用される2つのshowルールを書きました。 whereセレクタを使用して、見出しをレベルでフィルタリングしました。 そして、サブセクションの見出しを本文と改行せずにレンダリングしました。 また、サブセクションの見出しの最後にピリオドを自動的に追加してます。

ここで、学会のスタイルガイドを確認しましょう。

これで、すべてのスタイルに準拠し、論文を学会に提出できます!完成した論文は次のようになっています。 The finished paper

まとめ

このセクションでは、ヘッダーとフッターの作成方法、関数とスコープを使用してローカルにスタイルをオーバーライドする方法、grid関数を使用してより複雑なレイアウトを作成する方法、個々の関数と文書全体のshowルールを記述する方法を学びました。 また、whereセレクタを使用して、見出しをそのレベルによってフィルタリングする方法も学びました。

結果として論文は大成功でした! あなたはその学会にて同じ志を持つ研究者にたくさん出会い、来年同じ学会で発表したいプロジェクトを計画しています。 その際に、同じスタイルガイドを使って新しい論文を書く必要があるため、あなたやあなたのチームのために、時間を節約できるテンプレートを作りたいと思うのではないでしょうか?

次のセクションでは、複数の文書で再利用できるテンプレートの作成方法を学びます。 これはより高度なトピックですので、今すぐには手が出せないという方は、後ほどお気軽にお越しください。