$\newcommand{\field}[1]{\mathbb{#1}}$ $\providecommand{\N}{}$ $\renewcommand{\N}{\field{N}}$ $\providecommand{\Q}{}$ $\renewcommand{\Q}{\field{Q}}$ $\providecommand{\R}{}$ $\renewcommand{\R}{\field{R}}$ $\providecommand{\Z}{}$ $\renewcommand{\Z}{\field{Z}}$ $\providecommand{\pa}{}$ $\renewcommand{\pa}[1]{\left\lparen #1 \right\rparen}$ $\providecommand{\br}{}$ $\renewcommand{\br}[1]{\left\lbrack #1 \right\rbrack}$ $\providecommand{\set}{}$ $\renewcommand{\set}[1]{\left\lbrace #1 \right\rbrace}$ $\providecommand{\abs}{}$ $\renewcommand{\abs}[1]{\left\lvert #1 \right\rvert}$ $\providecommand{\norm}{}$ $\renewcommand{\norm}[1]{\left\lVert #1 \right\rVert}$ $\providecommand{\floor}{}$ $\renewcommand{\floor}[1]{\left\lfloor #1 \right\rfloor}$ $\providecommand{\ceil}{}$ $\renewcommand{\ceil}[1]{\left\lceil #1 \right\rceil}$ $\providecommand{\eval}{}$ $\renewcommand{\eval}[1]{\left. #1 \right\rvert}$ $\providecommand{\pd}{}$ $\renewcommand{\pd}[2]{\dfrac{\partial #1}{\partial #2}}$ $\DeclareMathOperator{\sign}{sign}$ $\DeclareMathOperator{\diag}{diag}$ $\DeclareMathOperator*{\argmax}{argmax}$ $\DeclareMathOperator*{\argmin}{argmin}$ $\providecommand{\Lim}{}$ $\renewcommand{\Lim}{\lim\limits}$ $\providecommand{\Prod}{}$ $\renewcommand{\Prod}{\prod\limits}$ $\providecommand{\Sum}{}$ $\renewcommand{\Sum}{\sum\limits}$ $\DeclareMathOperator{\softmax}{softmax}$ $\DeclareMathOperator{\cat}{concatenate}$ $\providecommand{\algoProc}{}$ $\renewcommand{\algoProc}[1]{\textbf{procedure}\text{ #1}}$ $\providecommand{\algoEndProc}{}$ $\renewcommand{\algoEndProc}{\textbf{end procedure}}$ $\providecommand{\algoIf}{}$ $\renewcommand{\algoIf}[1]{\textbf{if } #1 \textbf{ do}}$ $\providecommand{\algoEndIf}{}$ $\renewcommand{\algoEndIf}{\textbf{end if}}$ $\providecommand{\algoEq}{}$ $\renewcommand{\algoEq}{\leftarrow}$ $\providecommand{\algoFor}{}$ $\renewcommand{\algoFor}[1]{\textbf{for } #1 \textbf{ do}}$ $\providecommand{\algoEndFor}{}$ $\renewcommand{\algoEndFor}{\textbf{end for}}$ $\providecommand{\algoWhile}{}$ $\renewcommand{\algoWhile}[1]{\textbf{while } #1 \textbf{ do}}$ $\providecommand{\algoEndWhile}{}$ $\renewcommand{\algoEndWhile}{\textbf{end while}}$ $\providecommand{\algoReturn}{}$ $\renewcommand{\algoReturn}{\textbf{return }}$ $\providecommand{\hash}{}$ $\renewcommand{\hash}{\unicode{35}}$

關於我

這是我的 GitHub。 目前我正在國立成功大學智慧型知識管理實驗室攻讀博士班,主要研究自然語言處理(Natural Language Processing)與深度學習(Deep Learning)演算法。

基於研究需求與個人興趣,我花了一些時間學習了實變數分析(real analysis),你可以在我的 GitHub 上找到我在閱讀 Analysis I-II, Terence Tao 時所撰寫的證明與筆記

關於這個網站

這個網站是用來搬移過去我在 HackMD 中所有的閱讀筆記。 由於 HackMD 在紀錄大量數學式時 MathJax v2 反應速度較慢(甚至會導致網頁直接無法反應),加上我撰寫筆記的數學內容含量較大,因此我無法繼續在 HackMD 上面繼續撰寫筆記,才決定使用 Jekyll 創建這個網站。

考量到 HackMD 能夠達成以下功能:

  1. 即時顯示撰寫內容(WYSIWYG)
  2. 進行版本紀錄
  3. 即時上傳圖片
  4. 支援 MathJax
  5. 使用 KaTex 或是 MathJax v3
  6. 儘量不考慮顯示方法(typesetting)
  7. 儘量不考慮閱讀裝置(RWD)

我在選擇新的筆記紀錄方式時也希望能夠達成以上需求。 因此我選擇:

  • 使用 markdown 格式而不是直接撰寫 $\LaTeX$ (滿足功能 6)
  • 使用 GitHub page(滿足功能 2)
  • 使用 Jekyll + kramdown 內建支援 MathJax 語法(滿足功能 4)
  • 雖然 KaTeX 執行速度快,但支援的功能較少,而 MathJax v3 在執行速度上大幅提升,並提供 \label, \eqref 等功能,讓撰寫變得更加方便
  • VSCode 中編輯 markdown,並且執行 bundle exec jekyll serve --livereload 讓更新能夠即時顯示在瀏覽器中(滿足功能 1)
  • 使用 Jekyll 本身提供的主題功能完成具有 RWD 功能的頁面(滿足功能 7)

但我仍然遇到以下問題:

  • 撰寫 markdown 時無法像 HackMD 即時完成撰寫與版本紀錄
  • 需要上傳圖片時無法像 HackMD 能夠以拖拉方法完成圖片上傳
  • Jekyll 4+ 的版本撰寫數學式時 kramdown 會不小心把 $\TeX$ 下標語法 _ 誤解成 markdown 語法,導致部份數學式子無法正常 render
    • kramdown 開發者稱這個問題已經解決,但我仍然會遇到部份數學式無法正常顯示,因此我無法確定是 kramdown 或是 Jekyll 的問題
    • 目前暫時是以 $\LaTeX$ 中的 \newcommand 指令想辦法避免此問題,主要是因為顯示錯誤通常發生在如 \text{some-text}_{sub} 的範例中使用多個字元組合而成的變數名稱結合下標導致無法正常 render,因此用 \newcommand{some-text}{\mycommand} 替換 macro。老實說我也不知道為什麼改用這個方法就沒問題了…
    • 問題細節請見 kramdown-issue-47
    • 我改回 Jekyll 3.9.0 版本就沒問題了,剛好 GitHub Page 也只支援 Jekyll 3.9.0 版本

因此我應該還是會繼續使用 HackMD 作為主要撰寫筆記的平台,並把撰寫完成的筆記內容上傳到這個網站。 如果未來我解決了以上問題,那我就有可能完全不使用 HackMD 作為撰寫平台。