
這不是我第一次嘗試創建新命令但失敗。我發現有些東西不起作用(出現“未定義的控制序列”或其他錯誤)。
使用引號-結束引號參數。
\newcommand{\mytest}[1]{ \quote #1 \endquote }
使用
\verb
帶有參數的命令\newcommand{\mytest}[1]{ \verb+#1+ }
使用
begin{lstlisting}
環境:\newcommand{\mytest}[1]{ \begin{lstlisting} #1 \end{lstlisting} }
你知道我可以在哪裡找到我能做什麼\newcommand
和不能做什麼的詳盡清單嗎?甚至更好,為什麼?
答案1
很難說你可以用 a 做什麼\newcommand
,因為可能性(真的)是無限的。
我可以談談你的兩個例子,指出你所犯的錯誤。
在第一個定義中,您使用了\quote
and \endquote
,這是一個錯誤;\quote
是 LaTeX 在找到 時執行的命令\begin{quote}
,但會發生這種情況開群後作為 的副作用\begin
。此群組通常在\end
LaTeX 發現時關閉,\end{quote}
從而自動撤銷 執行的參數設定\quote
。
根據你的定義,\mytest{something}
你會發現線寬是永久改變左邊的壓痕將永遠持續下去。相反,可以肯定地說
\newenvironment{myenv}{\quote}{\endquote}
因為分組將由\begin{myenv}
和提供\end{myenv}
。
的主要特點是什麼\newcommand
?讓我們來看一個簡單的例子:
\newcommand{\foo}[1]{?#1!}
現在,如果您輸入\foo{xyz}
,則與輸入完全相同
?xyz!
因為當 TeX 掃描時,\foo
它知道它必須找到一個參數(\foo
如果不是的話,則為後面的第一個標記{
,或者直到匹配的整個標記列表)並用指令中指定的替換文本}
替換,其中表示為。\foo<argument>
\newcommand
<argument>
#1
您最多可以有九個參數(甚至根本沒有)。所做的一切就是這個「替換」。透過適當的定義以及條件結構,您甚至可以定義遞歸宏,但這太長了,無法描述。 「使用者定義」的最大部分只是標記邏輯單元的簡單(或稍微複雜)的替換。
TeX 不會掃描命令後面的內容,直到它有到。因此,在執行 時\foo
,它不會越過參數並在參數內展開任何宏,直到宏替換結束。所以之後
\foo{\baz{x}}
TeX 將會看到
?\baz{x}!
之後它將首先進行處理?
,然後就\baz{x}
好像這些內容從一開始就存在於輸入中一樣,但在第二個範例中顯示出細微的差異。
\foo{\baz{x}}
打字和打字的區別?\baz{x}!
TeX 已經有了代幣化的 \baz{x}
。
該\verb
命令的工作原理是更改所有特殊字元的含義。它透過延遲吸收要逐字排版的文字來實現這一點,這將在一組中發生;所以
\verb+\baz{x}+
將執行以下步驟
- 開啟一個群組(透過提供
{
) - 開始以等寬字體排版
- 將所有特殊字元的含義變更為“可列印”
- 定義
+
為}
(群組結束標記) - 繼續排版你找到的任何東西
- 尾隨
+
將撤銷所有特殊設置
描述並不完整,但足以滿足我們的目的;還有其他與理解整體情況無關的技術細節。
當你定義時會發生什麼
\newcommand{\foo}[1]{\verb+#1+}
正如你建議的?當 TeX 看到\foo{\baz{x}}
它時,它知道它必須掃描參數並將其標記化。因此論證是四個令牌(我用•分隔它們)
\baz • { • x • }
\
且、和 的含義沒有變化{
,}
可以繼續執行。更糟的是,+
that 應該改變其意義,成為組結束標記,無法修改,因為它已經在定義時被標記化了。因此,LaTeX 有一個保護機制,不允許\verb
出現在命令的參數中,因為如果你在這樣的地方使用它,任何形式的邪惡都可能發生:在無法撤消設定的情況下更改特殊字元的含義會讓你陷入困境。
有解決方法嗎?是的,請參閱如何將 \verb 指令放入 \textbf{} 區塊內?,但首先要問自己是否真的需要在指令的參數中逐字逐句地開始。