置頂介紹文

這裡主要放一些關於數學和 LaTeX 的文章, 文章內的檔案一律用 xelatex 編譯而成。
如果你想下載我的 tex 檔回去修改編譯, 請將 preamble.7z 解壓縮後和 tex 檔放在同一個資料夾中即可編譯。
部落格內的文章也有部份是網路或書籍中的資料經過統整編輯而成, 如有侵權請告知。
有任何問題也歡迎留言或 E-mail 給我。

2016年12月15日 星期四

LaTeX 自訂巨集指令 - 條件式 xifthen 套件

先前說明了自訂巨集指令 (command) 的基本用法, 這篇我們來介紹如何在指令中加上條件式, 讓指令的使用更靈活。

首先我們需要載入 xifthen 這個套件。每個 LaTeX 的套件通常都用一個說明的檔案, 在 google 輸入名稱就找得到。比方說這個連結: xifthen

當然我們還是會介紹用法, 如下例:

......
\usepackage{xifthen}

\newcommand{\AAA}[1]{\ifthenelse{\equal{#1}{a}}{True}{False}}
\newcommand{\BBB}[1]{\ifthenelse{\equal{#1}{a}}{預設文字A}{#1}}
\newcommand{\CCC}[1][a]{\ifthenelse{\equal{#1}{a}}{預設文字B}{#1}}

\begin{document}

\AAA{a}\; \AAA{b}

\BBB{a}\; \BBB{在這裡寫一些字}

\CCC\; \CCC[還可以設定成有預設值的]

\end{document}

結果如下:

xifthen 提供了條件式的語法為 \ifthenelse{判斷式}{真}{假}, 當我們用在定義新的指令時, 就變成上例中(條件式為 \equal{}{}), 當輸入的值與 a 相等時, 就顯示{真}裡面的內容, 否則顯示{假}的內容。

\ifthen 也有其他的條件式像是:
  1. \cnttest 比較數字大小
  2. \dimtest 比較長度
  3. \isempty 判斷是否為空集合
  4. \endswith 判斷結尾是否為某字串
  5. \isin 判斷內容中是否包令某字串
也可以用 \newtest 自行設定比較複雜的條件式, 用法上都是類似的, 說明檔裡也有很清楚的例子, 在這裡就先不一一細說了。

2016年12月11日 星期日

LaTeX 自訂指令 (command) 基礎篇

LaTeX 裡有一大堆的指令, 不過用久了還是覺得不夠用或是常用的一直輸入很煩, 所以我們來談談如何自訂指令 (又或者稱為巨集指令)。

雖然在本文中我們用指令一詞, 不過事實上這就是巨集 (macro) 了, 只是好像一看到巨集大家都會覺得是高端使用者的玩意兒, 事實上在 LaTeX 裡, 巨集指令是相當常用, 也是用 LaTeX 的人一定要學會的技能。

先來定義一個新的指令 (command), 如下例, 我們可以把常用的字串包在一起成為一個新的指令, 那麼將來只要輸入這個指令就可以了。

......
\newcommand{\stuinf}{\hfill 班級:\underline{\hspace{2cm}}座號:\underline{\hspace{1cm}}姓名:\underline{\hspace{3cm}} \\}

\begin{document}

\stuinf

\end{document}

不過只是這樣還不夠, 我們希望能定義出像 LaTeX 一樣能輸入其他文字 (也就是帶有參數) 的指令, 如下例:

......
\newcommand{\by}[1]{\hfill【#1】}

\begin{document}

這可能是一個考題。\by{108學測}

\end{document}

接在新指令後的 [1] 表示可以"必須"有一個大括號, 對應到指令裡的 #1, 如果想要更多的變量, 可以這麼做:

......
\newcommand{\testtitle}[3]{臺北市立麥斯高中 #1學年度第#2學期數學科#考卷}

\begin{document}

\testtitle{105}{2}{期末}

\end{document}

有時候我們不想要每次都輸入所有的參數, 可以選擇性的輸入(未輸入的參數就留白或忽略); 又希望未輸入時, 參數能有預設值, 輸入後又能改變參數, 那麼我們再來看最後這個例子:

......
\newlength{\fillspace}
\setlength{\fillspace}{1cm}
\newcommand{\exf}[2][]{\underline{\hspace{#1\fillspace}#2}}
\newcommand{\exff}[2][3.5]{\underline{\hspace{#1\fillspace}#2}}

\begin{document}

\exf{test1}

\exf[2]{test1}

\exff{test2}

\exff[4.5]{test2}

\end{document}

我在這個例子裡定義了一個長度 (length), 有機會再另外談。另外我定義了兩個新的指令, \exf, \exff, 這兩個指令在 [2] 之後都還有另一個 [], 用來表示第一個參數 #1 為選擇性輸入(要輸入時需用中括號), \exf 的 [] 裡沒有任何預設值, 而 \exff 的 [3.5] 則表示未輸入參數時就自動代入參數 3.5, 來看看結果是什麼:


結果分別是留白底線 1cm, 2cm, 3.5cm 和 4.5cm。

要自訂指令有兩點需要注意的是, 第一, 新的指令不能是 LaTeX 裡已經有的指令; 第二, 在 LaTeX 裡, 大小寫指的是不同的指令, 可以善加利用。

2016年12月10日 星期六

LaTeX 好用套件 (package) - catchfilebetweentags

這個套件的名稱實在非常直白 (笑), 用途就是在一個 tex 檔中取出某一段文字, 用來合併檔案十分方便。

在這裡我們有三個文件, 分別是 00.tex, 01.tex 和 02.tex, 我們要在 01.tex 和 02.tex 中取出一段文字放在 00.tex 裡。

% 00.tex

......

\usepackage{catchfilebetweentags}

\begin{document}

這個文件可以先有一些文字

\ExecuteMetaData[01]{mytaga}

\ExecuteMetaData[02]{mytagb}

\end{document}

接下來是 01.tex

% 01.tex

......

\begin{document}

%<*mytaga>
這是會被取走的文字 text part1....
%</mytaga>

\end{document}

然後是 02.tex

% 02.tex

......

\begin{document}

%<*mytagb>
這也是會被取走的文字 text part2....
%</mytagb>

\end{document}

那麼編譯 00.tex 就會出現這樣的結果:


這個套件的優點是, 原本把檔案合併只能用 \input 把整個檔案放到另一檔案中, 但用這個套件可以保證每個檔案都是可以獨立編譯的檔案, 然後如果需要合併則只取文字部份合併即可。

一個小缺點就是這個套件可以合併編譯出 PDF 檔, 但是對原始檔案文字沒有合併的功能。