
1. LaTeX 中劃鉤與打叉的常見需求場景寫論文、做技術(shù)報告、整理審稿意見的時候經(jīng)常需要在文檔里標(biāo)記“對”和“錯”。比如一份實(shí)驗記錄表某些條目通過了驗證某些條目失敗了又比如一份檢查清單需要逐項確認(rèn)是否完成。這種場景下用 LaTeX 排版時怎么優(yōu)雅地打出勾號和叉號就成了一個很實(shí)際的問題。很多人第一反應(yīng)是直接復(fù)制粘貼 Unicode 字符 ? 和 ?。這個做法在純文本編輯器里看著沒問題但到了 LaTeX 里尤其是用 pdfLaTeX 編譯的時候大概率會報錯或者顯示成空白方塊。原因很簡單pdfLaTeX 默認(rèn)的字體編碼不包含這些符號的字形。你看到的“亂碼”不是 LaTeX 的 bug而是字體本身就沒有這個字符。所以LaTeX 里劃鉤打叉這件事核心要解決的是符號來源和編譯引擎兼容性兩個問題。不同的方案適用于不同的使用場景選錯了方案輕則符號顯示不出來重則整個文檔編譯失敗。這篇文章面向的是已經(jīng)會用 LaTeX 寫基本文檔、但遇到符號問題時不知道從哪下手的人。不管你是寫學(xué)術(shù)論文、做項目報告還是整理個人筆記下面這些方法都能直接拿去用。我會把每種方案的適用條件、具體操作、踩坑經(jīng)驗都講清楚讓你看完就能動手。2. 方案選型五種主流做法及其適用條件2.1 方案對比與選擇邏輯在 LaTeX 里實(shí)現(xiàn)勾號和叉號目前主流的路子有這么幾條用amssymb宏包提供的數(shù)學(xué)符號、用pifont宏包的 dingbat 字符、用fontawesome5宏包、用 TikZ 手繪、以及直接插入圖片。每條路都有自己的脾氣選哪個取決于你的編譯引擎、文檔類型和對符號外觀的要求。先看一張對比表心里有個底方案依賴宏包編譯引擎要求符號外觀適用場景amssymb數(shù)學(xué)符號amssymb無特殊要求數(shù)學(xué)風(fēng)格偏細(xì)學(xué)術(shù)論文、公式環(huán)境pifontdingbatpifont無特殊要求裝飾性較粗表格、清單fontawesome5fontawesome5XeLaTeX/LuaLaTeX 最佳圖標(biāo)風(fēng)格現(xiàn)代報告、演示文稿TikZ 手繪tikz無特殊要求完全自定義需要特殊樣式時圖片插入graphicx無特殊要求取決于圖片特殊需求選擇的核心邏輯是這樣的如果你用的是 pdfLaTeX優(yōu)先考慮amssymb和pifont這兩個最穩(wěn)。如果你用 XeLaTeX 或 LuaLaTeXfontawesome5可以放心用符號樣式也更好看。TikZ 方案最靈活但代碼量最大適合對符號外觀有精確控制需求的情況。圖片方案一般不推薦除非你有現(xiàn)成的矢量圖且不想折騰代碼。2.2 為什么 pdfLaTeX 下 Unicode 字符不靠譜這里得單獨(dú)說一下為什么不能直接打 Unicode 字符。pdfLaTeX 處理字符的方式是查字體表默認(rèn)的 Computer Modern 字體里根本沒有 ?U2713和 ?U2717這兩個碼位。你打進(jìn)去它就當(dāng)不認(rèn)識要么報Missing character警告要么直接輸出一個空白。有人會說那我用inputenc宏包聲明 UTF-8 不就行了不行。inputenc解決的是“輸入編碼”問題它告訴 LaTeX 你寫的字節(jié)序列對應(yīng)哪個 Unicode 碼位但字體里有沒有這個碼位的字形是另一回事。這就像你告訴別人一個地址但那個地址根本沒有房子結(jié)果還是一樣的。XeLaTeX 和 LuaLaTeX 在這方面就好很多它們直接支持 Unicode配合系統(tǒng)字體可以顯示大部分符號。但即便如此不同字體對符號的支持程度也不一樣不是所有字體都有勾號和叉號。所以最穩(wěn)妥的做法還是用專門的宏包來生成這些符號。3. 基于 amssymb 的數(shù)學(xué)符號方案3.1 基本用法與代碼示例amssymb是美國數(shù)學(xué)學(xué)會提供的符號宏包里面包含了大量數(shù)學(xué)符號其中就有勾號和叉號。用法非常簡單\documentclass{article} \usepackage{amssymb} \begin{document} 勾號\(\checkmark\) \\ 叉號\(\times\) \\ 粗叉號\(\boldsymbol{\times}\) \end{document}\checkmark輸出的是一個帶勾的符號\times輸出的是乘號在標(biāo)記場景下可以當(dāng)叉號用。如果你覺得\times太細(xì)可以配合\boldsymbol加粗但需要amsmath宏包支持。這個方案最大的好處是不需要任何特殊編譯引擎pdfLaTeX 直接就能編譯符號也能正常顯示。而且amssymb幾乎是所有數(shù)學(xué)文檔的標(biāo)配你大概率已經(jīng)在用了不需要額外引入新依賴。3.2 數(shù)學(xué)符號方案的局限與應(yīng)對\checkmark的樣式偏數(shù)學(xué)化線條比較細(xì)放在表格里做標(biāo)記的時候視覺沖擊力不夠強(qiáng)。如果你想要更醒目的效果可以配合顏色宏包xcolor來加色\usepackage{amssymb} \usepackage{xcolor} \newcommand{\yes}{\textcolor{green}{\checkmark}} \newcommand{\no}{\textcolor{red}{\(\times\)}}這樣在表格里用\yes和\no就能得到綠色勾和紅色叉辨識度立刻上來了。還有一個問題是\checkmark在有些字體下大小不太協(xié)調(diào)跟周圍文字對不齊。這時候可以用\raisebox微調(diào)位置\newcommand{\yes}{\raisebox{0.1ex}{\checkmark}}0.1ex這個值需要根據(jù)實(shí)際效果微調(diào)一般上下浮動0.05ex到0.2ex之間就能找到合適的對齊位置。注意\checkmark在amssymb里的定義依賴amsfonts如果你只加載了amssymb但沒加載amsfonts可能會報錯。不過現(xiàn)代 TeX 發(fā)行版里amssymb會自動加載amsfonts一般不用手動加。4. 基于 pifont 的 dingbat 符號方案4.1 pifont 的基本用法pifont宏包提供了一套 dingbat 字符也就是裝飾性符號。它的用法跟amssymb不太一樣需要用\ding{編號}來調(diào)用。勾號和叉號的編號分別是 51 和 55\documentclass{article} \usepackage{pifont} \begin{document} 勾號\ding{51} \\ 叉號\ding{55} \end{document}\ding{51}輸出的是一個粗體的勾號\ding{55}輸出的是一個粗體的叉號。這兩個符號的線條比amssymb的版本粗不少放在表格里非常醒目。pifont同樣不需要特殊編譯引擎pdfLaTeX 直接支持。而且它提供的符號種類很多除了勾和叉還有箭頭、星星、圓圈等做檢查清單的時候可以搭配使用。4.2 在表格中批量使用 pifont實(shí)際項目里最常見的場景是在表格里批量標(biāo)記。下面是一個完整的例子\documentclass{article} \usepackage{pifont} \usepackage{xcolor} \newcommand{\cmark}{\textcolor{green!70!black}{\ding{51}}} \newcommand{\xmark}{\textcolor{red!70!black}{\ding{55}}} \begin{document} \begin{tabular}{lcc} \hline 檢查項 結(jié)果 備注 \\ \hline 數(shù)據(jù)完整性 \cmark 通過 \\ 格式規(guī)范性 \cmark 通過 \\ 引用準(zhǔn)確性 \xmark 需修正 \\ 圖表清晰度 \cmark 通過 \\ \hline \end{tabular} \end{document}這里用了green!70!black和red!70!black這種顏色混合寫法目的是讓顏色不那么刺眼打印出來也清晰。純綠色和純紅色在屏幕上看著還行但打印成黑白之后對比度可能不夠混一點(diǎn)黑色進(jìn)去會好很多。4.3 pifont 的注意事項pifont的\ding命令生成的符號是文本模式下的不能直接在數(shù)學(xué)環(huán)境里用。如果你需要在公式里打勾得用\text{}包起來或者改用amssymb的方案。另外\ding{51}和\ding{55}在不同字體下的外觀可能有細(xì)微差異但整體風(fēng)格是一致的。如果你發(fā)現(xiàn)符號大小跟周圍文字不匹配可以用\scalebox調(diào)整\usepackage{graphicx} \newcommand{\cmark}{\scalebox{1.2}{\ding{51}}}1.2是縮放比例根據(jù)實(shí)際需要調(diào)整就行。提示pifont的符號在 beamer 幻燈片里表現(xiàn)也很好做演示文稿的時候可以直接用不需要額外調(diào)整。5. 基于 fontawesome5 的現(xiàn)代圖標(biāo)方案5.1 fontawesome5 的安裝與基本用法fontawesome5是一個圖標(biāo)字體宏包提供了大量現(xiàn)代風(fēng)格的圖標(biāo)其中就包括勾號和叉號。它的用法跟前面兩個方案差別比較大需要先加載宏包然后用\faCheck和\faTimes來調(diào)用\documentclass{article} \usepackage{fontawesome5} \begin{document} 勾號\faCheck \\ 叉號\faTimes \\ 圓圈勾號\faCheckCircle \\ 圓圈叉號\faTimesCircle \end{document}fontawesome5提供了多種樣式的勾號和叉號有實(shí)心的、空心的、帶圓圈的、帶方框的選擇余地很大。而且圖標(biāo)風(fēng)格統(tǒng)一做出來的文檔看起來很現(xiàn)代。5.2 編譯引擎的坑與解決方案fontawesome5最大的問題是對編譯引擎有要求。它底層依賴fontspec宏包而fontspec只能在 XeLaTeX 或 LuaLaTeX 下工作。如果你用 pdfLaTeX 編譯會直接報錯。所以用這個方案之前先確認(rèn)你的編譯引擎。如果你在 Overleaf 上可以在項目設(shè)置里把編譯器改成 XeLaTeX 或 LuaLaTeX。如果你在本地用 TeX Live 或 MiKTeX命令行編譯時加-xelatex或-lualatex參數(shù)。有人會問那我能不能在 pdfLaTeX 下用fontawesome5答案是不能。fontawesome5的文檔里寫得很清楚它只支持 Unicode 引擎。如果你必須用 pdfLaTeX就老老實(shí)實(shí)回到amssymb或pifont方案。5.3 fontawesome5 在表格中的實(shí)戰(zhàn)配置下面是一個在 XeLaTeX 下用fontawesome5做檢查表的完整例子\documentclass{article} \usepackage{fontawesome5} \usepackage{xcolor} \usepackage{booktabs} \newcommand{\yes}{\textcolor{green!60!black}{\faCheckCircle}} \newcommand{\no}{\textcolor{red!60!black}{\faTimesCircle}} \begin{document} \begin{tabular}{lc} \toprule 項目 狀態(tài) \\ \midrule 需求分析 \yes \\ 架構(gòu)設(shè)計 \yes \\ 編碼實(shí)現(xiàn) \yes \\ 單元測試 \no \\ 集成測試 \no \\ \bottomrule \end{tabular} \end{document}booktabs宏包提供的\toprule、\midrule、\bottomrule比默認(rèn)的\hline好看很多做正式報告的時候建議用上。注意fontawesome5的圖標(biāo)默認(rèn)是文本模式如果在數(shù)學(xué)環(huán)境里用需要\text{}包裹。另外圖標(biāo)的顏色默認(rèn)繼承當(dāng)前文字顏色用\textcolor可以單獨(dú)設(shè)置。6. TikZ 手繪方案完全自定義勾和叉6.1 為什么要用 TikZ 畫勾和叉前面三種方案都是“拿來主義”用現(xiàn)成的符號。但有時候現(xiàn)成符號滿足不了需求比如你想要一個特定粗細(xì)、特定角度、特定顏色的勾號或者想要勾和叉之間有動畫效果的過渡在 beamer 里這時候就得自己畫。TikZ 是 LaTeX 里最強(qiáng)大的繪圖工具畫一個勾號或者叉號對它來說是小菜一碟。而且 TikZ 畫的符號是矢量圖形放大縮小都不會失真打印質(zhì)量極高。6.2 用 TikZ 畫勾號的完整代碼下面是一個畫勾號的例子\documentclass{article} \usepackage{tikz} \newcommand{\tikzcheck}{% \begin{tikzpicture}[scale0.3,baseline0.1ex] \draw[line width2pt,green!60!black,line capround,line joinround] (0,0.5) -- (0.5,0) -- (1.5,1.2); \end{tikzpicture}% } \begin{document} 這是一個勾號\tikzcheck \end{document}這段代碼的邏輯是定義三個點(diǎn)(0,0.5)是勾號的起點(diǎn)(0.5,0)是轉(zhuǎn)折點(diǎn)(1.5,1.2)是終點(diǎn)。用\draw連接這三個點(diǎn)設(shè)置線寬2pt、顏色green!60!black、線帽round、線接頭round就得到了一個圓潤的勾號。scale0.3控制整體大小baseline0.1ex控制跟周圍文字的對齊。這兩個參數(shù)需要根據(jù)實(shí)際效果微調(diào)。6.3 用 TikZ 畫叉號的完整代碼叉號更簡單兩條交叉的線就行\(zhòng)newcommand{\tikzxmark}{% \begin{tikzpicture}[scale0.3,baseline0.1ex] \draw[line width2pt,red!60!black,line capround] (0,0) -- (1,1); \draw[line width2pt,red!60!black,line capround] (0,1) -- (1,0); \end{tikzpicture}% }兩條線分別從(0,0)到(1,1)和從(0,1)到(1,0)交叉點(diǎn)自然形成叉號。線寬和顏色跟勾號保持一致視覺上統(tǒng)一。6.4 TikZ 方案的優(yōu)缺點(diǎn)與適用建議TikZ 方案最大的優(yōu)點(diǎn)是完全可控。線寬、顏色、角度、大小、對齊方式全都可以精確調(diào)整。而且不依賴任何特殊字體或編譯引擎pdfLaTeX 直接就能用。缺點(diǎn)也很明顯代碼量大每個符號都要寫一段 TikZ 代碼。如果文檔里只有幾個勾和叉還能接受如果要批量使用代碼會顯得很臃腫。這時候可以把 TikZ 代碼封裝成命令像前面那樣定義\tikzcheck和\tikzxmark用的時候直接調(diào)用就清爽多了。提示TikZ 畫的符號在 beamer 里可以配合\only或\onslide做出現(xiàn)動畫效果很好。比如先顯示問題再顯示叉號最后顯示勾號引導(dǎo)觀眾注意力。7. 常見問題與排查技巧實(shí)錄7.1 符號顯示為空白或方塊的排查思路這是最常見的問題。符號打出來了編譯也不報錯但 PDF 里就是看不到或者顯示成一個空心方塊。排查步驟是這樣的第一步確認(rèn)編譯引擎。如果你用的是 pdfLaTeX檢查是否加載了正確的宏包。amssymb和pifont在 pdfLaTeX 下都能正常工作fontawesome5則必須用 XeLaTeX 或 LuaLaTeX。第二步檢查宏包加載順序。有些宏包之間有沖突比如pifont和某些符號宏包同時加載時可能會覆蓋彼此的定義。把pifont放在靠后的位置通常能解決問題。第三步查看編譯日志。pdfLaTeX 遇到不認(rèn)識的字符時會輸出Missing character警告在日志里搜索這個關(guān)鍵詞能快速定位是哪個字符出了問題。第四步如果以上都沒問題嘗試換一個方案。比如amssymb的\checkmark顯示不出來換成pifont的\ding{51}試試。不同宏包對字體的依賴不同換一個可能就好了。7.2 符號大小與文字不匹配的調(diào)整方法勾號和叉號的大小跟周圍文字不協(xié)調(diào)是很常見的視覺問題。調(diào)整方法取決于你用的方案amssymb方案用\raisebox調(diào)整垂直位置用\scalebox調(diào)整大小。pifont方案用\scalebox調(diào)整大小用\raisebox調(diào)整位置。fontawesome5方案用\fontsize配合\selectfont調(diào)整大小或者用\scalebox。TikZ 方案直接改scale參數(shù)和baseline參數(shù)。下面是一個通用的調(diào)整示例\usepackage{graphicx} \newcommand{\yes}{\raisebox{-0.1ex}{\scalebox{1.1}{\ding{51}}}} \newcommand{\no}{\raisebox{-0.1ex}{\scalebox{1.1}{\ding{55}}}}\raisebox{-0.1ex}把符號往下移一點(diǎn)\scalebox{1.1}把符號放大 10%。這兩個值需要根據(jù)實(shí)際字體大小微調(diào)沒有萬能參數(shù)。7.3 在表格中批量標(biāo)記時的對齊問題表格里批量放勾和叉最容易出現(xiàn)的問題是列寬不一致、符號對不齊。解決方法是用固定寬度的列比如c列配合\makebox\begin{tabular}{l{\centering\arraybackslash}m{1cm}c} \hline 項目 狀態(tài) 備注 \\ \hline 需求分析 \yes 完成 \\ 架構(gòu)設(shè)計 \yes 完成 \\ 編碼實(shí)現(xiàn) \no 進(jìn)行中 \\ \hline \end{tabular}{\centering\arraybackslash}m{1cm}定義了一個寬度固定為 1cm、內(nèi)容居中的列。這樣不管符號本身多寬列寬都是固定的表格看起來整齊。如果表格里勾和叉混用建議把符號命令統(tǒng)一封裝確保大小和顏色一致。不要一會兒用\checkmark一會兒用\ding{51}那樣視覺上會很亂。7.4 常見問題速查表問題現(xiàn)象可能原因解決方法符號顯示為空白字體缺少字形換用pifont或 TikZ 方案符號顯示為方塊編碼不匹配確認(rèn)宏包加載正確檢查編譯引擎編譯報錯Missing characterpdfLaTeX 不支持該字符改用amssymb或pifontfontawesome5報錯編譯引擎不是 XeLaTeX/LuaLaTeX切換編譯引擎符號太大或太小默認(rèn)大小不合適用\scalebox調(diào)整符號跟文字不對齊基線位置偏差用\raisebox微調(diào)表格中符號不對齊列寬不固定用m{寬度}定義固定列寬顏色打印后看不清顏色對比度不夠用green!70!black等混合色提示遇到問題時先看編譯日志再換方案最后調(diào)參數(shù)。這個順序能幫你快速定位問題避免在錯誤的方向上浪費(fèi)時間。8. 實(shí)操心得與避坑經(jīng)驗8.1 宏包沖突的預(yù)防與處理pifont和amssymb同時加載時一般不會直接沖突但如果你還加載了其他符號宏包比如bbding或wasysym就可能出現(xiàn)命令重定義的問題。癥狀是編譯時報Command \ding already defined之類的錯誤。解決辦法有兩個一是用\let命令重命名沖突的命令二是調(diào)整宏包加載順序。更穩(wěn)妥的做法是只加載你真正需要的宏包不要一股腦全加上。比如你只需要勾和叉pifont就夠了不需要再加載bbding。8.2 顏色選擇的實(shí)戰(zhàn)建議勾和叉的顏色選擇不只是好看的問題還涉及打印效果和色盲友好性。純綠色和純紅色在色盲用戶眼里可能難以區(qū)分建議用green!70!black和red!70!black這種混合色或者用藍(lán)色和橙色代替綠色和紅色。另外如果文檔需要打印成黑白顏色就完全失效了。這時候可以靠形狀區(qū)分勾號用\ding{51}叉號用\ding{55}形狀差異足夠明顯黑白打印也能分辨。8.3 在 beamer 中使用的特殊注意事項beamer 幻燈片里用勾和叉跟普通文檔差不多但有幾個地方要注意。beamer 默認(rèn)會覆蓋一些命令的定義如果你在導(dǎo)言區(qū)定義了\yes和\no在 beamer 里可能需要重新定義或者用\newcommand而不是\renewcommand。另外beamer 的\only和\onslide命令可以讓勾和叉分步出現(xiàn)做演示的時候效果很好。比如先顯示問題列表再逐個顯示勾和叉引導(dǎo)觀眾跟著你的節(jié)奏走。8.4 批量替換的實(shí)用技巧如果你已經(jīng)寫了一篇文檔里面用了 Unicode 的 ? 和 ?現(xiàn)在想批量替換成 LaTeX 命令可以用編輯器的查找替換功能。把?替換成\yes把?替換成\no然后在導(dǎo)言區(qū)定義這兩個命令就行。但要注意替換之前先確認(rèn)文檔里沒有其他地方用到這兩個字符。如果有替換后會出錯。建議先備份再替換替換后編譯一遍確認(rèn)沒問題再繼續(xù)。注意批量替換時如果文檔里有\(zhòng)verb或lstlisting環(huán)境里面的內(nèi)容不應(yīng)該被替換。大多數(shù)編輯器的查找替換功能都支持排除特定區(qū)域用之前先看一下編輯器的文檔。8.5 符號在 PDF 書簽和目錄中的表現(xiàn)勾號和叉號如果出現(xiàn)在章節(jié)標(biāo)題里會影響到 PDF 書簽和目錄的顯示。因為書簽和目錄用的是純文本不支持 LaTeX 命令。如果你在\section{}里用了\ding{51}書簽里可能會顯示成亂碼或者空白。解決辦法是用\texorpdfstring命令給 PDF 書簽提供一個純文本替代\section{檢查結(jié)果\texorpdfstring{\ding{51}}{[通過]}}這樣在正文里顯示勾號在書簽里顯示[通過]兩邊都正常。8.6 跨平臺兼容性的最后檢查如果你把 LaTeX 源碼發(fā)給別人對方用的編譯引擎可能跟你不一樣。為了確保兼容性建議在文檔開頭加一個引擎檢查\usepackage{iftex} \ifPDFTeX \usepackage{pifont} \newcommand{\yes}{\ding{51}} \newcommand{\no}{\ding{55}} \else \usepackage{fontawesome5} \newcommand{\yes}{\faCheck} \newcommand{\no}{\faTimes} \fiiftex宏包可以檢測當(dāng)前使用的編譯引擎然后根據(jù)引擎加載不同的宏包和定義不同的命令。這樣不管對方用 pdfLaTeX 還是 XeLaTeX文檔都能正常編譯。這個技巧在合作寫論文的時候特別有用因為你不知道合作者用什么引擎加一段引擎檢查能省去很多來回溝通的成本。8.7 我個人在實(shí)際操作中的體會我最早用的是amssymb的\checkmark后來發(fā)現(xiàn)它在表格里太細(xì)不夠醒目就換成了pifont的\ding{51}。再后來做演示文稿發(fā)現(xiàn)fontawesome5的圖標(biāo)風(fēng)格更現(xiàn)代又換了一次。折騰了幾輪之后我的經(jīng)驗是不要追求一個方案打天下根據(jù)場景選方案才是正道。學(xué)術(shù)論文用amssymb因為數(shù)學(xué)符號風(fēng)格統(tǒng)一技術(shù)報告用pifont因為粗體符號醒目演示文稿用fontawesome5因為圖標(biāo)好看特殊需求用 TikZ因為完全可控。每個方案都有它的位置關(guān)鍵是知道什么時候用哪個。還有一個教訓(xùn)是盡早確定方案不要中途換。我有一篇文檔寫到一半從amssymb換到pifont結(jié)果所有表格里的符號都要重新調(diào)整大小和對齊白白浪費(fèi)了一個下午。如果一開始就選好方案后面就不用返工了。最后再分享一個小技巧如果你經(jīng)常需要在文檔里打勾和叉可以建一個自己的宏包文件把所有符號定義都放進(jìn)去以后每個文檔只需要\usepackage{mycheckmarks}就行。這樣既統(tǒng)一了風(fēng)格又省去了重復(fù)定義的麻煩。宏包文件里可以同時包含多種方案的定義用的時候根據(jù)編譯引擎自動切換一勞永逸。