新命令:什麼是不能做的?

新命令:什麼是不能做的?

這不是我第一次嘗試創建新命令但失敗。我發現有些東西不起作用(出現“未定義的控制序列”或其他錯誤)。

  • 使用引號-結束引號參數。

    \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,因為可能性(真的)是無限的。

我可以談談你的兩個例子,指出你所犯的錯誤。

在第一個定義中,您使用了\quoteand \endquote,這是一個錯誤;\quote是 LaTeX 在找到 時執行的命令\begin{quote},但會發生這種情況開群後作為 的副作用\begin。此群組通常在\endLaTeX 發現時關閉,\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}+

將執行以下步驟

  1. 開啟一個群組(透過提供{
  2. 開始以等寬字體排版
  3. 將所有特殊字元的含義變更為“可列印”
  4. 定義+}(群組結束標記)
  5. 繼續排版你找到的任何東西
  6. 尾隨+將撤銷所有特殊設置

描述並不完整,但足以滿足我們的目的;還有其他與理解整體情況無關的技術細節。

當你定義時會發生什麼

\newcommand{\foo}[1]{\verb+#1+}

正如你建議的?當 TeX 看到\foo{\baz{x}}它時,它知道它必須掃描參數並將其標記化。因此論證是四個令牌(我用•分隔它們)

\baz • { • x • }

\且、和 的含義沒有變化{}可以繼續執行。更糟的是,+that 應該改變其意義,成為組結束標記,無法修改,因為它已經在定義時被標記化了。因此,LaTeX 有一個保護機制,不允許\verb出現在命令的參數中,因為如果你在這樣的地方使用它,任何形式的邪惡都可能發生:在無法撤消設定的情況下更改特殊字元的含義會讓你陷入困境。

有解決方法嗎?是的,請參閱如何將 \verb 指令放入 \t​​extbf{} 區塊內?,但首先要問自己是否真的需要在指令的參數中逐字逐句地開始。

相關內容