置頂介紹文

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

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

2016年11月24日 星期四

LaTeX 免費編輯器 Texmaker

鑑於 Miktex 的原生編輯器 Texworks 真的很陽春, 對初學者不是很友善,, 對老手也有一些地方不方便, 所以我花了時間研究了較多人推薦的 Texmaker, 真的很好用喔, 來試試吧。

先列一些 Texmaker 的優點
  1. 有數學輸入的按鈕: 這對初學者很重要, 忘記語法時可以直接找到, 當然常用的最後還是背起來比較方便。
  2. 有指令輸入快速完成: 特別用在很長的指令如 \includegraphics, 只要輸入前幾個單字很按 Enter 就會出現 \includegraphics[scale=•]{•} 了。 
  3. 左列會將 \section 各自編列為大綱, 點選就會跳到該節, 方便找到檔案的位置
  4. 會把引入的外部檔案 (\input, \include) 標示出來, 點選後可以直接開啟, 這對檔案的編修非常的有用喔
  5. 可以收起整節或整個環境的文字段落, 保持版面的清爽
這麼方便的編輯器, 因為不是原生編輯器, 所以我們需要加入一些設定, 以下是用可攜的 (Portable) MikTeX 和可攜的 Texmaker 來設定:
  1. 檔案放置的位置: 先要有一個資料夾 (LaTeX), 在這之中開一個資料夾 (MikTeX), 在 MikTeX 裡放入 MikTeX 和 Texmaker 可攜檔的資料夾 (miktex_portable, texmakerwin32usb)
  2. 把要編譯的檔案用一資料夾打包 (xelatex_work) 放在和剛剛的 MikTeX 同一層
  3. 然後去 texmakerwin32usb 資料夾裡找到 texmaker.exe , 按右鍵將其設為桌面捷徑, 再把這個桌面捷徑剪下放在 LaTeX 裡 (和 xelatex_work 同層), 以後開檔案都要先點這個捷徑, 建議可以放在工作列的快速選單中
接下來, 要在 Texmaker 裡設定編譯的方式, 我們這麼設定為 xelatex 編譯, 方法如下:
  1. 點選 [選項] → [設定 Texmaker]
  2. 首先要修改編譯的方式為 xelatex, 所以要把 [命令] 中 LaTeX 的欄位改為 xelatex -interaction=nonstopmode %.tex 
  3. 必須把 xelatex 欄位修改為相對路徑 "../miktex_portable/miktex/bin/latexmk.exe" -e "$pdflatex=q/pdflatex -synctex=1 -interaction=nonstopmode/" -pdf %.tex 
  4. 把快速編譯選為 XeLaTeX + View PDF, 之後只要按 [F1] 就會用 xelatex 編譯了
  5. 到編輯器裡將字型編碼設定為 UTF-8
這樣所有的設定都完成了, 要開啟檔案的話, 先點選剛剛建立的捷徑 (如果有放到工作列就很方便), 然後按 Ctrl+O 開檔案, Texmaker 會自動記得你的資料夾, 用修改日期排序的話就能快速找到檔案了

2016年10月3日 星期一

LaTeX 表格設計

從 Word 轉移到 LaTeX 的過程中, 就屬表格和插入圖片最難以掌握, 因為似乎總不能隨心所欲的想怎樣就怎樣, 不過學會之後, 會發現 LaTeX 的表格很好掌握喔!

這篇會把所有表格常用的語法, 包括基本表格 (tabular) 環境, 表格內水平置中 (center), 垂直置中, 表格手動內換行 (break line) 以及 設定表格樣式 (newcolumntype) 的語法一併說明。

\documentclass[12pt]{article}

\usepackage[CJKnumber]{xeCJK} %讓中英文字體分開設置
\setCJKmainfont[BoldFont={cwTeX Q Hei Bold}]{cwTeX Q Ming Medium} % 設預設中文字型及預設粗體

\usepackage[a4paper, margin=1.5cm]{geometry}%設定紙張及邊界
\renewcommand{\baselinestretch}{1.4}%設定行距{倍數}

\usepackage{tabularx, array, slashbox}%表格
\usepackage{makecell} %表格內換行
\usepackage{multirow}
\renewcommand{\multirowsetup}{\centering} %合併表格後, 內容水平置中

\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}
\newcolumntype{B}[1]{>{\centering\arraybackslash}b{#1}}

\begin{document}

\begin{tabular}{|c|p{0.2\textwidth}|p{5cm}|P{0.3\linewidth}|}
\hline
1-1 & 1-2 & 1-3 & 1-4 \\
\hline
2-1& 這是很多字的第二欄, 所以他會自動換行, 一直換一直換一直換......... & 2-3 \par 第一種手動換行 \par 2-3 & \makecell[t]{2-4 \\ 第二種手動換行 \\ 2-4} \\
\hline
3-1 & \multicolumn{2}{c|}{\makecell[t]{雙欄合併 \\ 換行要用 makecell}} & 3-4 \\
\hline
4-1 & \multicolumn{1}{c|}{單格水平置中} & \multicolumn{1}{r|}{單格水平靠右} & 4-4 \\
\hline
5-1 & \multirow{4}{\linewidth}{垂直置中} & 5-3 & \mbox{} \vspace*{2cm} \\
\hline
\end{tabular}


\end{document}

在 tabular 環境中先設定參數, c 表示該欄均水平置中, p{}表示表格頂端對齊, 大括號內則是欄寬, 可以是絕對長度 (5cm), 也可以是相對長度 (0.2\textwidth)。而在 c 和 p 這兩個表格樣式 (columnstyle) 之間用 | 可以畫出表格的鉛直線。

因為每一欄只能有一種表格樣式 (columnstyle), 用 c 置中就無法再用 p 來設定寬度, 反之亦然, 因此若要置中同時設定表格寬度, 就必須先在宣告區定義
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}, 那麼 LaTeX 會在每一欄一開始加入 \centering\arraybackslash 來讓內容水平置中。

由於表格環境裡已經用 \\ 來表示換列, 所以表格單格內換行必須用 \par 或是 \makecell 來處理。\par 可用在一般的換行, 但是有些地方會行不通; \makecell 則是相當的泛用, 其中參數 [t] 是用來設定為頂端對齊, 若用 [c] 則是中間對齊。

若需要雙欄合併可用 \multicolumn 語法, 第一個指令為合併欄數, 第二個指令為合併後水平對齊方式, c 為置中, r 為置右, 第三欄則為表格內文字。也因為 \multicolumn 可以重新定義水平對齊方式, 所以我們可以用合併"一欄" 的語法來讓單欄表格內容水平置中或水平靠右。

若需要設定表格列高則在末欄加上 \vspace 即可, 如果末欄沒有文字時需要用 \mbox{} 假裝文字。

設定了表格列高後, 如希望文字垂直置中, 則用 \multirow 語法, 第一欄為列數, 用來調整文字位置, 第二欄為欄寬, 用 \linewidth 表示與現在欄寬一致, 第三欄為表格內文字。又因為我在宣告區設定了 \renewcommand{\multirowsetup}{\centering}, 所以內容會呈現水平置中, 此設定預設值為靠左 (\raggedright), 如果希望靠右, 則設定為 \renewcommand{\multirowsetup}{\raggedleft} 即可。

在 LaTeX 或是較正式的排版中, 我們不建議用表格來達成排版的目的, 表格主要還是運用於資料的整理及傳達, 而排版應該在文章中讓 LaTeX 自行計算即可。一旦這樣來理解表格, 那麼 LaTeX 的表格不僅更能表現出我們要的效果, 並且在設定好之後完全沒有格式跑掉的疑慮, 其方便性體驗過就能明白了。

article_latex表格基本功.tex
article_latex表格基本功.pdf