|
| 1 | +--- |
| 2 | +layout: "lesson" |
| 3 | +lang: "zh-hant" |
| 4 | +title: "更多內容:處理錯誤" |
| 5 | +description: "本課展示了 LaTeX 中的一些更常見的錯誤,並解釋了鏈式錯誤和靜默錯誤。" |
| 6 | +toc-anchor-text: "更多內容:處理錯誤" |
| 7 | +--- |
| 8 | + |
| 9 | +## 在環境末尾報告的錯誤 |
| 10 | + |
| 11 | +某些環境(特別是`amsmath`的對齊環境和`tabularx`表格)在處理內容之前會掃描整個環境主體。這意味著環境內的任何錯誤都會在最後一行被報告。然而,如主課程所示,TeX 顯示的錯誤上下文仍然應該能夠準確指出錯誤位置。 |
| 12 | + |
| 13 | +```latex |
| 14 | +% !TEX program=lualatex |
| 15 | +
|
| 16 | +\documentclass{ctexart} |
| 17 | +\usepackage{amsmath} |
| 18 | +
|
| 19 | +\begin{document} |
| 20 | +
|
| 21 | +\begin{align} |
| 22 | +\alpha &= \frac{1}{2}\\ |
| 23 | +\beta &= \frak{2}{3}\\ |
| 24 | +\gamma &= \frac{3}{4} |
| 25 | +\end{align} |
| 26 | +
|
| 27 | +\end{document} |
| 28 | +``` |
| 29 | + |
| 30 | +這裡的錯誤將在第12行被報告 |
| 31 | + |
| 32 | +``` |
| 33 | +l.12 \end{align} |
| 34 | +``` |
| 35 | +{: .noedit :} |
| 36 | + |
| 37 | +儘管實際錯誤是在第10行,這可以從上下文行中看出: |
| 38 | + |
| 39 | +``` |
| 40 | +! Undefined control sequence. |
| 41 | +<argument> ...ha &= \frac {1}{2}\\ \beta &= \frak |
| 42 | + {2}{3}\\ \gamma &= \frac {... |
| 43 | +``` |
| 44 | +{: .noedit :} |
| 45 | + |
| 46 | + |
| 47 | +## 由早期錯誤引起的虛假錯誤 |
| 48 | + |
| 49 | +當從命令列互動式呼叫 LaTeX 時,可以在第一個錯誤處使用`x`停止處理,編輯文件並重新執行。但是,如果你滾動過錯誤提示,或使用自動執行此操作的編輯器或線上系統,TeX 將嘗試恢復;然而這可能會導致報告更多的錯誤。 |
| 50 | + |
| 51 | +因此,不要太在意報告的錯誤 _數量_,始終專注於修復第一個報告的錯誤。 |
| 52 | + |
| 53 | +```latex |
| 54 | +% !TEX program=lualatex |
| 55 | +
|
| 56 | +\documentclass{ctexart} |
| 57 | +\begin{document} |
| 58 | +Text_word $\alpha + \beta$. |
| 59 | +
|
| 60 | +More text. |
| 61 | +\end{document} |
| 62 | +``` |
| 63 | + |
| 64 | +這裡的錯誤是下劃線`_`,它應該輸入為`\_`。 |
| 65 | + |
| 66 | +TeX 在 _第一個_ 錯誤訊息中正確地報告了這一點 |
| 67 | + |
| 68 | +``` |
| 69 | +! Missing $ inserted. |
| 70 | +<inserted text> |
| 71 | + $ |
| 72 | +l.5 Text_ |
| 73 | + word $\alpha + \beta$. |
| 74 | +? |
| 75 | +``` |
| 76 | +{: .noedit :} |
| 77 | + |
| 78 | +然而,如果你滾動過`?`提示,TeX 會通過新增一個`$`來恢復,這樣`_`就會在數學模式中被視為下標。數學模式然後會繼續到結束數學模式的`$`,因此後面的`\alpha`會在文字模式中被看到,從而產生另一個錯誤 |
| 79 | + |
| 80 | +``` |
| 81 | +! Missing $ inserted. |
| 82 | +<inserted text> |
| 83 | + $ |
| 84 | +l.5 Text_word $\alpha |
| 85 | + + \beta$. |
| 86 | +? |
| 87 | +``` |
| 88 | +{: .noedit :} |
| 89 | + |
| 90 | + |
| 91 | +## 不觸發錯誤提示的錯誤 |
| 92 | + |
| 93 | +某些錯誤,特別是直到檔案末尾才被檢測到的錯誤,不會生成錯誤提示,而只是在日誌中給出警告。 |
| 94 | + |
| 95 | +如果你在 TeXLive.net 伺服器上嘗試這個示例,它預設會返回一個 PDF;要在日誌中檢視錯誤訊息,請新增`%!TeX log`。 |
| 96 | + |
| 97 | +```latex |
| 98 | +% !TEX program=lualatex |
| 99 | +
|
| 100 | +\documentclass{ctexart} |
| 101 | +\begin{document} |
| 102 | +
|
| 103 | + Text {\large some large text) normal size? |
| 104 | +
|
| 105 | +\end{document} |
| 106 | +``` |
| 107 | + |
| 108 | +在這個例子中,大小變化錯誤地以 `)` 而不是 `}` 結尾。直到檔案末尾,TeX 檢測到仍有一個未關閉的組時,才會檢測到這種情況。它在這裡報告組以 `{` 開頭的行。它無法檢測到實際錯誤,因為 `)` 被視為“普通文字”。 |
| 109 | + |
| 110 | +``` |
| 111 | +(\end occurred inside a group at level 1) |
| 112 | +
|
| 113 | +### simple group (level 1) entered at line 5 ({) |
| 114 | +``` |
| 115 | +{: .noedit :} |
| 116 | + |
| 117 | + |
| 118 | +<script> |
| 119 | + window.addEventListener('load', function(){ |
| 120 | + if(editors['pre0'] != null) editors['pre0'].moveCursorTo(8, 15, false); |
| 121 | + if(editors['pre3'] != null) editors['pre3'].moveCursorTo(3, 5, false); |
| 122 | + if(editors['pre6'] != null) editors['pre6'].moveCursorTo(4, 30, false); |
| 123 | + }, false); |
| 124 | +</script> |
0 commit comments