置頂介紹文

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

2021年3月10日 星期三

數學作業

「爸,我不會借位」
『你要算什麼』
「9-6又6/16」
『那你要做什麼』
「借位」
『你為什麼要借位』
「因為分子不夠減?」
『分子?』
「......」
『好,換個問題,你知不知道什麼是 3/4』
「3/4 就是 3/4 阿」
『那 1-3/4 是多少』
「1/4」(秒答)
『那 1-2/5 呢』
「3/5」
『那 2-3/4 呢』
「1又1/4」
『你會阿,那 3-1又2/5呢』
「呃......2又3/5,不對,是 1又3/5」
『那 1-6/16 是多少』
「10/16」
『9-6/16呢』
「8又10/16」
『那 9-6又6/16呢』
「喔,2又10/16嘛」
盼盼是很聰明的孩子,但她學了借位這個技巧後卻忘記了分數的本質,因此被困在數字的漩渦中
在認知不夠穩固的情況下,單靠著技巧算題目是會令人迷失的
然而我們卻沒有時間停下來聽聽孩子哪裡懂、哪裡不懂,為了一張張高分的考卷而付出的大量練習,就連孩子自己都不知道自己是不是真的懂了,而最真實的情況就是不懂,最慘的情況就是自以為懂了
而被考試成績追著跑的從來就不只是孩子,而是孩子週遭的大人們
盼盼後來沒有用借位的技巧算這個題目,因為那是本來就在她心裡、被遺忘的分數的本質

2021年1月18日 星期一

最有安全感的距離 - 你需要的時候, 我在

紀念盼盼第一天正式主動要求到自己的房間睡覺, 來寫下自己對孩子的獨立與依賴的想法

故事要從「最後一個在兒童主日學教室的爸爸」說起
兒童主日學, 是教會為了孩子們能正確的認識聖經和上帝在每週日約一個半小時的課程, 從1歲半開始一直到6年級結束, 1歲半時, 爸爸媽媽陪在旁邊是理所當然, 慢慢地, 教室裡的父母的數量也隨著孩子年紀的增加而減少, 然後中班, 最後大班, 教室裡只剩我一個爸爸還陪著盼盼上課
主日學老師喜歡和盼盼開玩笑的說: 你又陪爸爸來上主日學阿, 沒有嘲諷, 只是開玩笑, 盼盼從不覺得羞愧, 因為我從不覺得羞愧
為什麼我一直都在, 因為盼盼認為她還沒準備好
小一時, 她就不讓我跟主日學了; 小二參加了詩班, 也在教室後待了一陣子, 因為她不了解情況; 圍棋課我到現在還在教室裡一起上課; 圍棋積分賽她則是單獨在教室中比賽; 學校社團她頭也不回的走進校園; 幼年團契她自己上樓自己下樓......
今天, 她要求要到自己的房間睡覺
我只有一個理念, 如果孩子準備好了, 就去, 如果還沒, 那麼爸爸就在, 正如我承諾只要她有需要而我還做的到, 我就不會拒絕她的討抱, 所以如果你看到一個爸爸扛著小三的女孩, 那可能就是我吧
我一直認為獨立是建立在安全感足夠的時候, 而安全感則是來自於親密關係的信任, 講的白話點就是「黏夠她就會離去了」
沒有一個孩子希望長大一直黏在爸媽身邊, 除非是爸媽剝奪他長大的機會, 孩子總是想獨立自主, 總是想脫離父母, 總是想走自己的路, 所以我從不擔心孩子不會獨立, 孩子不需要你費力的把他推開, 因為他總會離開, 因此重要的是他帶著什麼樣的安全感離開
我希望我的孩子始終從理智上、感性上都知道, 她可以離開, 而且只要她有需要, 爸爸隨時都在

2017年11月17日 星期五

用 LaTeX 做數學考卷 (三) : 選擇題篇 - 【追加】手動設定選項

這篇是 用 LaTeX 做數學考卷 (三) : 選擇題篇 的追加設定, 請先閱讀之前的內容。

鑑於有時候因著選項數的不同, 我們會想要用不同的排版 (例如說只有 4 個選項時, 不想讓他們分成第一行 3 個, 第二行 1 個選項), 所以我們可以在文章中手動修改。

但是我還想不到讓 LaTeX 自動因著選項而調整的方法, 所以先這樣解。

方法是在 preamble 時先設定一個 \if \else \fi 的判斷式, 程式碼如下:

\newif\ifchoices

......

\NewEnviron{choices}
{\setcounter{choices}{0}%
\let\choice\choicetemp
\settowidth{\choiceslen}{\vbox{\halign{##\hfil\cr\BODY\crcr}}}

\ifchoices

\ifdim\choiceslen>.5\linewidth
\setlength{\choiceslen}{\linewidth}%一行一選項
\else
\ifdim\choiceslen>.25\linewidth
\setlength{\choiceslen}{.5\linewidth}%一行三選項
\else
\setlength{\choiceslen}{.25\linewidth}%一行五選項
\fi
\fi

\else

\ifdim\choiceslen>.5\linewidth
\setlength{\choiceslen}{\linewidth}%一行一選項
\else
\ifdim\choiceslen>.333\linewidth
\setlength{\choiceslen}{.5\linewidth}%一行兩選項
\else
\ifdim\choiceslen>.25\linewidth
\setlength{\choiceslen}{.333\linewidth}%一行三選項
\else
\ifdim\choiceslen>.2\linewidth
\setlength{\choiceslen}{.25\linewidth}%一行四選項
\else
\setlength{\choiceslen}{.2\linewidth}%一行五選項
\fi
\fi
\fi
\fi

\fi

\let\choice\choicefinal
\setcounter{choices}{0}%
\begin{flushleft}
\bgroup\BODY\hfill\egroup
\end{flushleft}}


首先用 \newif 設定一個新的判斷式 \ifchoices, 然後在「段落 A2」的指令中設定選項長度及換行的部份修改程式碼如上, 那麼只要在文稿中加入 \choicesture, 之後的選項就會改成一行只有 1, 2, 4 選項, 加上 \choicesfalse, 之後的選項就是一行中可以有 1, 2, 3, 4, 5 個。

如果在文稿中完全不加入此指令, 則預設值為 5 個選項的情形。

2017年1月18日 星期三

LaTeX 自訂巨集 - 題目與解答

看這篇之前, 可以參考一下這篇《用 LaTeX 做數學考卷 (六) : 答案卷與解答篇 -- 文字標籤與解答對應》, 不過這篇還是會把有用到的指令完整介紹。

這次我們的目標是要設計出下圖這樣的東西, 並且在文稿內要將題目和解答放在一起, 讓 LaTeX 自動幫我們分出題目和解答, 並且將解答自動編號排序下來。



因為這裡有大量的指令要介紹, 所以我們先列出一個大綱:
  1. 用 enumitem 套件來自訂條列式環境的樣式並設定隨文條列式 (inline) 的用法
  2. 用 counter 來做到計數自動化
  3. 用 label 和 ref 將輸入的文字排版到自訂的位置
  4. 用 loop 讓 latex 自動計算題數來排版解答
  5. 結語

這裡我們就先把上面那個文件的完整指令碼貼出來, 再慢慢來看

\documentclass[12pt]{article}
\usepackage[CJKnumber]{xeCJK}%中文
\setCJKmainfont[BoldFont={cwTeX Q Hei Bold}]{cwTeX Q Ming Medium} % 設預設中文字型及預設粗體
%\setCJKmainfont{思源黑體 TW}
%\setCJKmainfont{思源黑體}
\setCJKfamilyfont{kai}{cwTeX Q Kai Medium}% 楷書          
\setCJKfamilyfont{hei}{cwTeX Q Hei Bold}% 黑體
\setCJKfamilyfont{ming}{cwTeX Q Ming Medium}% 明體
\setCJKfamilyfont{yuan}{cwTeX Q Yuan Medium}% 圓體
\setCJKfamilyfont{fsong}{cwTeX Q Fangsong Medium}% 仿宋體

\newcommand{\kai}[1]{{\CJKfamily{kai}#1}}% 用 \kai{使用楷書}
\newcommand{\hei}[1]{{\CJKfamily{hei}#1}}% 用 \hei{使用黑體}
\newcommand{\ming}[1]{{\CJKfamily{ming}#1}}% 用 \ming{使用明體}
\newcommand{\yuan}[1]{{\CJKfamily{yuan}#1}}% 用 \yuan{使用圓體}
\newcommand{\fsong}[1]{{\CJKfamily{fsong}#1}}% 用 \fsong{使用仿宋體}

\newcommand{\Z}{\ming{。}}
\newcommand{\Q}{\ming{、}}
\newcommand{\ZB}{\hei{。}}
\newcommand{\QB}{\hei{、}}

\usepackage{amsmath, amsfonts, amssymb, bbding}%數學符號
\usepackage{graphicx}%圖形
\usepackage[colorlinks=true, linkcolor=black]{hyperref}%讓\label和\ref的連動在pdf 檔中產生超連結, 點擊即可跳頁
\usepackage{tcolorbox}

\everymath{\displaystyle}

\usepackage[inline]{enumitem}%與beamer相衝

\newlist{assessment}{enumerate}{1}%自我評量條列環境
\setlist[assessment]{labelindent=1\parindent, leftmargin=*,label*=\CrossOpenShadow\;\arabic*)}

\newlist{ill}{enumerate*}{1}
\setlist[ill]{label=(\arabic*)}

\newlist{ilc}{enumerate*}{1}
\setlist[ilc]{label=(\Alph*)}

%計數器(純數字) \no
\newcounter{nocounter}
\setcounter{nocounter}{1} 
\newcommand{\no}{\arabic{nocounter}\addtocounter{nocounter}{1}}

%自我評量解答與標籤(自動) \ansass{<answer>} (放在要填入的位置上) 要有hyperref套件
\newcounter{assessmentlabel}\setcounter{assessmentlabel}{0}
\makeatletter
\DeclareDocumentCommand{\ansass}{m g}{%
  \protected@write \@auxout {}{\string \newlabel {assessment\theassessmentlabel}{{\IfValueTF{#2}{#1, \par #2}{#1}}{\thepage}{\IfValueTF{#2}{#1, \par #2}{#1}}{assessment\theassessmentlabel}{}}}%
  \hypertarget{assessment\theassessmentlabel}{} \stepcounter{assessmentlabel}
}

\makeatother
%自我評量答案, 直接在格子中填入 \ansassis 即可
\newcounter{assessmentans}\setcounter{assessmentans}{0}
\newcommand{\ansassis}{\ref{assessment\theassessmentans}\stepcounter{assessmentans}}
%重複輸入, 一直到第一個{}內的數字才停止
\newcounter{assloop}
\setcounter{assloop}{1}
\newcommand\ansassloop[2]{
  \loop \ifnum\numexpr\value{assloop}-1 < #1
   #2%
    \stepcounter{assloop}%
  \repeat
}

\newcommand{\showtheanswer}{
\everymath{\textstyle}
\begin{footnotesize}
\begin{tcolorbox}[colback=white,title=\CrossOpenShadow 自我評量參考答案 \CrossOpenShadow]
\ansassloop{\theassessmentlabel}{(\no) \ansassis ; \;}
\end{tcolorbox}
\end{footnotesize}
\everymath{\displaystyle}
}

\begin{document}

\section{自我評量}
\begin{assessment}
\item \ansass{$\frac{28}{11}$} 求 $0.\overline{23}+2.3\overline{13}$ 的值\Z
\item \ansass{ACD} 下列哪些數值是有理數?
\begin{ilc}
\item $0.1\overline{3}$
\item $3+\sqrt{2}$
\item $0$
\item $\frac{\sqrt{75}}{\sqrt{12}}$
\item $\pi$
\end{ilc}
\item \ansass{$16$} $n\in\mathbb{N}$, $\frac{n}{5}<\sqrt{11}<\frac{n+1}{5}$, 則 $n$ 值為何?
\item \ansass{$6$} 已知 $\sqrt{16+\sqrt{252}}$ 的整數部份為 $a$, 小數部份為 $b$, 試求 $2a+b-\frac{3}{b}$ 的值\Z
\item \ansass{ACE} 若 $a$, $b$, $c$, $l$, $m$, $n$ 是實數, $a>b>c$, $l>m>n$, $a+b+c=0$, 則下列何者為真? \\
\begin{ilc}
\item $a>0$
\item $b>0$
\item $c<0$
\item $al>0$
\item $al+bm+cn>0$
\end{ilc}
\item \ansass{$6$, $(3,2)$} 設 $a$, $b$ 為正實數且 $2a+3b=12$, 則 $ab$ 的最大值為何? 此時 $(a,b)$ 分別為何?
\item \ansass{$0\leq\alpha\leq 17$, $-19\leq\beta\leq 9$, $1\leq\gamma\leq 109$, $\frac{1}{5}\leq\delta\leq\frac{3}{2}$} $x$, $y\in\mathbb{R}$, 若 $(x-2)^2\leq 1$ 且 $|y-\frac{7}{2}|\leq\frac{13}{2}$, 試求下列各式的範圍\Z \\
\begin{ill}
\item $\alpha=2x+y+1$, 
\item $\beta=x-2y$, 
\item $\gamma=x^2+y^2$, 
\item $\delta=\frac{3}{y+5}$\Z
\end{ill}
\item \ansass{$(-2,5)$} 若不等式 $|ax+1|\geq b$ 的解為 $x\geq 3$ 或 $x\leq -2$, 則數對 $(a,b)$ 為何?
\item \ansass{$-\frac{2}{3}<x<2$} 解不等式 $|x|+2|x-1|<4$\Z
\item \ansass{$20$, $7040$, $7039$} 令 $x=\sqrt{7}+\sqrt{3}$, $y=\sqrt{7}-\sqrt{3}$, 則 \\
\begin{ill}
\item $x^2+y^2$, 
\item $x^6+y^6$, 
\item $(\sqrt{7}+\sqrt{3})^6$ 的整數部份為何?
\end{ill}
\end{assessment}
\showtheanswer

\end{document}

接著就按著大綱來介紹完整的指令了。
  1. 用 enumitem 套件來自訂條列式環境的樣式並設定隨文條列式 (inline) 的用法
    我們藉由這個主題來介紹自訂 enumerate 的用法

    \usepackage[inline]{enumitem}%與beamer相衝

    \newlist{assessment}{enumerate}{1}%自我評量條列環境
    \setlist[assessment]{labelindent=1\parindent, leftmargin=*,label*=\CrossOpenShadow\;\arabic*)}

    \newlist{ill}{enumerate*}{1}
    \setlist[ill]{label=(\arabic*)}

    \newlist{ilc}{enumerate*}{1}
    \setlist[ilc]{label=(\Alph*)}

    \usepackage[inline]{enumitem} 使用套件 enumitem, 並設定 inline 以便設定隨文條列式。

    \newlist 定義新的條列式, 第一個 {} 是指對應的原條列式內容 (itemize; enumerate; description), enumerate* 則是隨文條列式 (inline); 第二個 {} 是指可用的(巢狀式)階層數。

    定義完之後"一定要"設定條列式的樣式 (\setlist), 至少要定義 \label, enumitem 可以讓我們非常自由的定義 \label 的樣式, 最簡單的樣式就是 \arabic (阿拉伯數字), 也可以用 \alph: 小寫英文字母; \Alph: 大寫英文字母; \Roman: 大寫羅馬數字; \roman: 小寫羅馬數字。

    leftmargin=* 用來設定左方留白, labelindent=1\parindent 則用來設定左方縮排, \parindent 是指段落開始時的縮排距離。

  2. 用 counter 來做到計數自動化
    在程式碼中我們用了大量的計數器 (counter), 因此我們一併介紹計數器的功能和用法。

    \newcounter{nocounter}\setcounter{nocounter}{1}
    \newcommand{\no}{\arabic{nocounter}\addtocounter{nocounter}{1}}

    用 \newcounter 設定一個計數器, 然後設定起始值 (\setcounter)。

    定義一個新的指令 (\newcommand{\no}) 將計數器以用阿拉伯數字顯示 (\arabic{}), 並在同時將計數器加 1 (\addtocpunter{}), 也可以用 \stepcounter{nocounter} 來讓計數器加 1。

    然而這個做法是讓文件顯示出數字, 如果要把數字讓 latex 拿來做內部的處理 (也就是說讓 latex 認得這個數字) 的話, 就要在這個計數器前加上\the, 變成 \thenocounter, 或是用指令 \value{nocounter}。

  3. 用 label 和 ref 將輸入的文字排版到自訂的位置
    這是整篇文章最關鍵的動作, 他可以讓文稿和編譯出來的稿件呈現截然不同的樣式, 用來呈現題目和答案分開的套件還有 answer 套件, 不過因為這個套件的靈活度相對較低, 所以我們自己寫。

    %自我評量解答與標籤(自動) \ansass{<answer>} (放在要填入的位置上) 要有hyperref套件
    \newcounter{assessmentlabel}\setcounter{assessmentlabel}{0}
    \makeatletter
    \DeclareDocumentCommand{\ansass}{m g}{%
    \protected@write \@auxout {}{\string \newlabel {assessment\theassessmentlabel}{{\IfValueTF{#2}{#1, \par #2}{#1}}{\thepage}{\IfValueTF{#2}{#1, \par #2}{#1}}{assessment\theassessmentlabel}{}}}%
    \hypertarget{assessment\theassessmentlabel}{} \stepcounter{assessmentlabel}
    }

    先設定一個計數器 assessmentlabel (因為我們不會在文稿中用到它, 所以故意讓名稱很長, 以免以後定義其他的會重複), 這個計數器比較特別的是他是從 0 開始的。

    定義一個新的指令 \ansass (這裡用 xfithen 套件裡的 \DeclareDocumentCommand 是純粹因為我懶得改, 這裡其實用 \newcommand 就可以了), 這個指令很長, 主要是將 \ansass{} 裡的文字貼上一個標籤 (label)。

    為了不要手動設定標籤, 所以我們利用計數器讓標籤能自動編號 (assessment\theassessmentlabel), 如上一條目所說的, 用 \theassessmentlabel 才能真的讓 latex 看懂這個數字, 所以指令最後就加上 \stepcounter{assessmentlabel} 讓計數器加 1。

    於是, 每當我們輸入一次 \ansass{}, 就會自動貼上標籤 assessment0, assessmnet1, .... 依序下去。而 \ansass{} 這個指令只會貼標籤, 是不會在文稿上顯示出任何文字的, 要顯示文字, 我們要用指令 \ref{}。(例如 \ref{assessmnet1}, 當然這很麻煩, 所以我們用自動計數+指令來簡化它)

    %自我評量答案, 直接在格子中填入 \ansassis 即可
    \newcounter{assessmentans}\setcounter{assessmentans}{0}
    \newcommand{\ansassis}{\ref{assessment\theassessmentans}\stepcounter{assessmentans}}

    接著我們定義一個新的計數器和指令, 讓 ref 也能自動編號的把剛剛所貼的標籤顯示出來。這個指令很單純, \ansassis 就是讓 \ref{} 的 {} 裡自動填上 assessment0, assessmnet1, ....。

  4. 用 loop 讓 latex 自動計算題數來排版解答
    雖然已經簡化了指令, 可是我們還是不想自己手動數我們到底輸入了幾個 \ansass 再重複的輸入 \ansassis 來編輯解答, 所以我們接下來再設定一個迴圈 (loop)。

    \newcounter{assloop}
    \setcounter{assloop}{1}
    \newcommand\ansassloop[2]{
    \loop \ifnum\numexpr\value{assloop}-1 < #1
    #2%
    \stepcounter{assloop}%
    \repeat }

    定義 \ansassloop{}{} 這個指令, 這個指令需要兩個參數, 第一個 {} 放數字, 代表要重複的次數, 第二個 {} 裡放要重複的文字。舉例來說, 如果輸入 \ansassloop{5}{xyz}, 那麼就會輸出 xyzxyzxyzxyzxyz。

    解釋一下指令內部。\ifnum 是條件式, 可用來比較數字大小, \numexpr 用來計算數字 (在 latex 裡直接輸入數字運算像 6+2 是沒有用的), 而條件式就是 assloop 這個計數器的值 \value{assloop} 減 1 < #1 (事實上就是計數器的值小於等於 #1) 的話, 就顯示 #2 並同時將計數器加 1, 然後重複 (\reapeat 回 \loop), 一直重複到計數器的值大於 #1 才停止。

    這個指令解決了重複輸入的問題, 接下來要解決手動數 \ansass 個數的問題。

    \ansassloop{\theassessmentlabel}{(\no) \ansassis ; \;}
    是的, 就這麼一行, 簡單的說, 就是把 \ansassloop 的第一個 {} 裡放上 \theassessmentlabel, 所以只要 assessmentlabel 這個計數器的值為何, (\no) \ansassis ; \; 就會重複幾次。而 assessmentlabel 這個計數器的值恰恰正好是文稿裡 \ansass 的個數了。(其實如果你很仔細的看, 你會發現這句話有點怪怪的, 至於是什麼問題以及為什麼我要這麼做, 這裡就賣個關子吧。)

    另外, 這個方法沒辦法用在 \item 上, 也就是說在 \ansloop 第二個 {} 放 \item 是沒有用的, 如果要用 \item, 必須改用 multido 這個套件。

  5. 結語
    最後簡單的把一些沒有說到的內容再補充一下。首先, 參考解答的方框我是用 tcolorbox 排版的, 可以去找他的介紹, 美化版面相當好用。

    \Z 和 \Q 這個指令是我用來強迫不論任何使用任何字體, 句號和頓號都要用 cwTeX 的字體排版 (也就是置於文章句末的下方)。

    \everymath{\textstyle} 和 \everymath{\displaystyle} 用來改變隨文數學式的大小。

    \CrossOpenShadow 這個十字架符號是來自於 bbding 這個 package。

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 檔, 但是對原始檔案文字沒有合併的功能。