しゅどぼ / SATySFiでレポート課題を書いた

Created Wed, 25 Oct 2023 10:39:23 +0900 Modified Mon, 23 Dec 2024 12:05:58 +0900
1175 Words

目標

実際の課題を載せるのはよくないので下のPDFのものを最終目標とする。

Unable to display PDF file. Download instead.

使用パッケージ一覧

書く

注意

SATySFiのsyntax highlightが無いのでみづらいかも

sectionをいじる

ます+sectionの表示をnから問nにしたい。このとき

(| <record> with <label> = <new-value> |)

という構文が使える。これは<record><label><new-value>にしたものを返す。よって、documentを、

document(|
  title = { レポート };
  author = { qitoy しゅどぼ };
  date = {};
  show-title = true;
  show-toc = false;
  style = ArticleJa.a4paper;
  design = (|
    ArticleJa.article with section-num-function = fun _ i -> `問` ^ arabic i;
  |);
  header-footer = ArticleJa.normalHF;
  fonts = ArticleJa.fonts;
|) '<>

などとすればよい。

ソースコード、実行結果を貼る

これは単純に+code-printer+file-printerをすればよいが、それぞれで書式を変えたくなる。なので、let inでそれぞれの変数に束縛させればよい。例

let source = 
  CodePrinter.default
    |> CodePrinter.set-syntax CodeSyntax.rust
    |> CodePrinter.set-theme CodeTheme.basic-light
    |> CodePrinter.set-line-break-mark (fun _ _ -> (inline-nil, inline-nil)) % 行のwrapにマーカーを付けない

let prompt =
  CodePrinter.default
    |> CodePrinter.set-line-break-mark (fun _ _ -> (inline-nil, inline-nil))
    |> CodePrinter.set-number-fun CodeDesign.number-fun-null % 行番号を付けない
in

参考文献を貼る

今回はwebサイトを貼りたいが、urlと著者を書かなくてはならない。urlは冗長なので(?)、hyper linkで埋め込むことにする。bibyfiにはちょうどよい書式が無さそうなので自前で用意しなくてはならない。

bibyfi-itemにはManualを選んだ。ここで欲しい要素は、titleaddressauthorのみなので、すべてデフォ値のレコードを用意してさっきの構文で書き換えるほうが良い。

let bib-default = 
  (|
    title = ` `;
    author = None;
    organization = None;
    address = None;
    edition = None;
    month = None;
    year = None;
    note = None;
    key = None;
  |)

let bibs =
  [
    (`aho`, Manual(|
      bib-default with title = `桂三度`;
      author = Some([`Wikipedia`;]);
      address = Some(`https://ja.wikipedia.org/wiki/%E6%A1%82%E4%B8%89%E5%BA%A6`);
    |));
  ]

そしてこのレコードをmarkdownでいう[title, author](address)に変換するbibyfi-themeを書けばよい。

let mk-index ctx index =
  let s = `[` ^ arabic index ^ `] `# in read-inline ctx (embed-string s)

let mk-manual r =
  match (r#author, r#address) with
  | (Some([author]), Some(address)) ->
    let inner = embed-string (r#title ^ `, `# ^ author) in { \href (address) (inner); }
  | _ -> { invalid }

let bibyfi-theme ctx index bib-item =
  match bib-item with
    | Manual(r) -> BiByFi.make-entry ctx (mk-index ctx index) (read-inline ctx (mk-manual r))
    | _ -> BiByFi.make-entry ctx (mk-index ctx index) (read-inline ctx { invalid })

数式を書く

azmathのドキュメントを読めばよい。特記すべき事項は、新しい括弧を定義したいときや、複数文字の変数などを定義したいとき、以下のようにする。

let-math \range m1 m2 = math-paren AZMathParens.square-bracket-l AZMathParens.round-bracket-r ${#m1 , #m2}
let-math \len = math-char MathOrd `len`

図を書く

通常、graphicsに文字を埋め込むのは難しそう(ちゃんと調べてない)なのだが、FigBox.graffiti-given-contextを使うとcontextを扱いやすくなる。以下のような関数を定義すると部分適応したものを渡すだけでよくなり、お得(?)。

func : args -> context -> graphics list

おわりに

ここまでする必要無かったなあ()