
我使用大量包含數學表達式的巨集來編寫講義和投影機幻燈片。我希望能夠根據是否運行投影機進行格式化。所以我使用\newif
語句編寫了條件代碼,該代碼有效除了當我想包含像\\
和 這樣的格式化字元時&
,在這種情況下,beamer 會拋出錯誤。這是範例程式碼:共有三行\ifThenBeamer
程式碼:前兩行拋出相同的錯誤,即
! Missing } inserted.
<inserted text>
}
l.40 \end{frame}
第三行沒問題。
\documentclass{beamer}
\newif\ifConditionOnBeamer
\makeatletter
\def\isConditionOnBeamer#1{
\ifnum\pdf@strcmp{\useBeamer}{#1}=0
\ConditionOnBeamertrue
\else
\ConditionOnBeamerfalse
\fi
}
\makeatother
\def\useBeamer{on}
\def\BeamerOn{\isConditionOnBeamer{on}}
\def\BeamerOff{\isConditionOnBeamer{off}}
\def\ifThenBeamer#1#2{
\ifConditionOnBeamer
{#1}
\else
{#2}
\fi
}
\BeamerOn
\begin{document}
\begin{frame}
\begin{align}
\ifThenBeamer{a \\ b}{c d} %This throws a Missing } inserted error
\ifThenBeamer{a & b}{c d}%This throws a Missing } inserted error
\ifThenBeamer{a b}{c d}
\end{align}
\end{frame}
\end{document}
有人可以解釋為什麼會拋出錯誤,以及如何修復它嗎?或者如果無法修復的話還有解決方法嗎?
謝謝!
答案1
環境align
內部使用表 ( \halign
) 和巨集\ifThenBeamer
在其參數周圍放置群組大括號。這些組與表格單元格和行的組混在一起。如果沒有大括號,則此範例可以正常工作:
\def\ifThenBeamer#1#2{
\ifConditionOnBeamer
#1%
\else
#2%
\fi
}
一個更具防禦性的版本在開頭移動了條件句的擴展:
\makeatletter
\newcommand*{\ifThenBeamer}{%
\ifConditionOnBeamer
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother
首先\ifConditionOnBeamer
被稱為。然後\expandafter
分支中的 執行結束\else
或呼叫\fi. It remains
\@firstoftwo or
\@secondoftwo . The macro reads the two arguments and selects one of them. Then
#1 or
#2` ,而無需條件中的後續標記。