將參數傳遞給命令的語法

將參數傳遞給命令的語法

在一般的程式語言中,我習慣透過以下方式呼叫函數:

myfunction(argument1, argument2, ..., argumentn)

看起來乳膠需要這種語法

\mycommand{argument1}{argument2}...{argumentn}

使用命令。我可以使用通常的函數語法呼叫命令(而不是為每個參數寫出大括號)嗎?我希望能夠做到這一點:

\mycommand{argument1, argument2, ..., argumentn}

答案1

其他答案涉及如何用逗號分隔,但也許一些更廣泛的解釋也是有用的。首先重要的是,雖然 LaTeX 可以進行一般編程,但它是一個用於排版的文件準備系統。底層語言(TeX)的設計也反映了相同的目標,而 LaTeX 在這裡很大程度上使用了與 TeX 本身相同的約定。

在傳遞參數方面,TeX 處理“平衡文字”,這是一些以 開頭{和結尾的任意材料(通常) }。用於分隔“平衡文字”的字元可以更改,但事實是我們需要這兩個字元並且它們是不同的。這意味著我們必須以以下形式傳遞參數

\foo{balanced text 1}{balanced text 2}

ETC。TeX 確實允許更複雜的「分隔」參數類型,因此我們可以設定 (正如大衛所做的那樣) 以逗號分隔材料

\def\foo(#1,#2){Stuff with #1 and #2}
\foo(abc,def) => #1 = abc, #2 = def

但這必須在程式層定義:我們不能只是「切換核心語法」。此外,我剛剛使用的簡單定義需要輸入中的逗號:如果您正在對其他通用語言進行建模,您可能希望參數是可選的。人們可以使用更複雜的程式來以可變數量的逗號進行分割,但這始終是一層在上面的核心。

需要記住的一個關鍵點是 TeX 沒有字串資料或函數/變數分割:我們只有「標記」。重要的是,這意味著我們很可能期望在任何地方使用逗號,因此如果我們使用 \foo(abc,efg) 語法,則必須「保護」逗號:

\foo({abc,def},ghi) => #1 = abc,def; #2 = ghi

(對我來說)這並不比

\baz{abc,def}{ghi}

這裡也值得注意的是,使用( ... )也會帶來一些問題:它們不能出現在參數中而不造成問題或沒有設定更複雜的程式碼(請參閱參考資料xparse)。

答案2

一種透過定義命令和處理命令來對參數清單的元素執行某些操作expl3(不直接使用 xparse)的方法,但該處理器命令基本上對清單的各個元素執行相同的操作。\SplitList

注意:如果許多參數具有不同的含義,則一種key-value方法更有效或至少不易出錯。

\documentclass{article}

\usepackage{xparse}


\ExplSyntaxOn
\newcommand{\foocmd}[1]{%
  \seq_set_from_clist:Nn \l_tmpa_seq {#1}
  \seq_map_inline:Nn \l_tmpa_seq {%
    \fooprocessorcmd{##1}%
  }
}

\ExplSyntaxOn

\newcommand{\fooprocessorcmd}[1]{\fbox{#1}}

\begin{document}
\foocmd{r,o,f,y,b,i,v}
\end{document}

答案3

將習語從一種語言強制轉移到另一種語言並不總是一個好主意,但例如

在此輸入影像描述

\documentclass{article}
\def\zz#1{\zzz#1\relax}
\def\zzz#1,#2,#3,#4\relax{\fbox{#1} \fbox{#2} \fbox{#3} \fbox{#4}}
\begin{document}

\zz{a,b,c,d}

\end{document}

請注意,與處理逗號分隔的清單不同(例如)

 \usepackage{array,color,longtable,booktabs}

上面定義\zz(z)的參數有固定數量,可以存取 to#1#4使用逗號語法而不是{}

它還假設四個參數不包括,,或者\relax如果需要,則需要由{}這樣的參數來保護\zz{{1,2},{3,4},{5,6},{7,8}}

答案4

這是一個非常簡單的listofitems方法。

\documentclass{article}
\usepackage{listofitems}
\newcommand\mycommand[1]{%
  \readlist*\myargs{#1}%
  The \myargslen{} arguments are \showitems\myargs.
  The 4th argument is ``\myargs[4].''
}
\begin{document}
\mycommand{this, is, a, big, test}

\mycommand{What, would, you do, for a, Klondike, bar?}
\end{document}

在此輸入影像描述

相關內容