編輯:關於賞金我對下面的問題很滿意,這個賞金就是針對這個問題的。我不認為我能接受更好的
我搜尋了一些有關 LaTeX 中可選參數的用法的信息,但有些事情對我來說還不是很清楚。
什麼時候
我的問題不是針對命令或包,而是針對兩者。
有時我們需要為套件或命令指定一個或多個可選參數。我們可以找到如下命令:
\Foo[OptArg1,OptArg2]{Arg1}{Arg2}
和喜歡:
\Foo[OptArg1][OptArg2]{Arg1}{Arg2}
對於第一個,我看到一個系列有兩個用逗號分隔的可選參數。對於第二個,我有兩個家庭,每個家庭都有一個可選參數。
我想這兩種方式有所不同,但還沒有完全理解我的命令何時必須使用第一種方式,何時必須使用第二種方式。
例如,假設我們需要一個命令,它將使用我們的第一個可選參數將第一個非可選參數分成幾個部分。然後我更喜歡第二種方式,因為在第一種方式中,我的逗號作為分隔符號將不會被理解(它已經是分隔符號)。但我仍然可以使用以下命令:
\Foo[separator={,},OptArg2]{Arg1}{Arg2}
做同樣的事情。
當然,如果我想用\Foo[separator={//}][OptArg2//OptArg3] 分隔第二個家庭的可選參數,將是唯一的(或至少是更好的)選擇,因為我有tt定義在閱讀第二個家庭參數之前的分隔符號。
如何
另外,有時,如果給出兩個家庭,則命令必須表現不同;如果給出一個家庭,則命令必須表現得順從。例如,在上面的範例中,如果未給出第一個參數,則將使用逗號分隔第二個系列可選參數。但如果給出了,那麼它將被用作分隔符,並且命令在讀取參數時會有不同的行為。
在這種情況下,我認為 \def 是比 newcommand 更通用的命令選項,因為我們在讀取參數時有更多選擇。 (\newcommand 將在讀取第一個參數或類似的內容之前中斷第二個參數。也請考慮包含在第二個系列參數中的「]」...)
我的問題是:
- 什麼時候(標準乳膠)我必須使用第一種方法,什麼時候必須使用第二種方法?
- \def 是在一般情況下定義命令的唯一或更好的方法嗎?
PS:在第二個問題中,考慮到我希望我的命令允許我透過讀取下一個字元來處理很多情況。 (例如,我想一一讀取命令後的字符,只有在找到兩個普通參數或命令 \stop 等時才停止。不詢問此代碼,只是詢問 \newcommand 是否可以做到這一點 - 它是一個不錯的選擇- 或如果\def 是唯一的選擇)
答案1
你的問題混合了兩件不同的事情。 LaTex2e 有可選參數[]
和強制參數,{}
所以
\Foo[OptArg1,OptArg2]{Arg1}{Arg2}
有一個可選參數和兩個強制參數。
\Foo[OptArg1][OptArg2]{Arg1}{Arg2}
有兩個可選參數和兩個強制參數。
第二個問題是逗號分隔列表,這可能根本不是語法的一部分,只是逗號被視為字符,例如之後
\newcommand\Foo[3][]{(#1)-(#2)(#3)}
然後#1
將是OptArg1,OptArg2
, #2
將是Arg1
,#3
將是Arg2
,結果將是排版
(OptArg1,OptArg2)-(Arg1)-(Arg2)
與逗號的搭配沒有特殊規則。
當然,命令可以對參數執行牠喜歡的操作,這可能包括迭代逗號。 Latex 格式中有一些工具可以實作 ( \@for
) 或多個套件提供巨集來解析逗號分隔的清單。然而,這與可選參數檢測無關。在(合法)語法範例中
\usepackage[foo,bar]{array,longtable}[2015/01/01 packages by you, me and someone]
有兩個可選參數和一個強制參數,第一個可選參數和強制參數稍後作為 , 處理的一部分\usepackage
以逗號分隔。第二個可選參數不是按逗號分割,而是實際上按/
和 空格分割,以從參數的開頭提取日期。
至於定義,如果一開始只有一個可選參數,則可以使用\newcommand
如果有兩個或更多,也可以使用\newcommand
但需要分階段定義宏,但使用 xparse
或類似的套件可能更容易允許更簡單的規範並自動處理定義所需的內部巨集。然而,最好不要有太多連續的可選參數,就像你有
\Foo[OptArg1][OptArg2]{Arg1}{Arg2}
如果您需要指定,則thenOptArg1
並不是真正可選的OptArg2
。語法如
\Foo[opt1=a,opt2=b]{Arg1}
允許獨立省略每個選項。但同樣,這種 key=value 解析可以應用於任何標記字串,無論它是強制參數還是可選參數。例如,graphicx
使用keyval
套件來解析其可選參數中的,
and=
\includegraphics[width=10pt,height=8pt]{image}
並hyperref
使用相同的解析來解析強制參數中的相同語法
\hypersetup{colorlinks=false,plainpages=true}