定義一個新指令,其輸出取決於內部參數

定義一個新指令,其輸出取決於內部參數

也許有人可以告訴我如何在 \LaTeX 中定義一個新命令,它可以採用一個強制值和另一個可選值(參數)作為輸入。在這種情況下,根據可選參數的值,輸出物件的類型應該會改變。

具體來說,就我而言,我需要指定一個命令\dependSet(<arg>, <opt par>)來繪製括號。在這種情況下,根據可選參數的存在/不存在應該改變輸出(內部存在/不存在垂直線):

功能 輸出
\dependSet{x, y} 在此輸入影像描述
\dependSet{x, y}{a} 排

因此,為了可用性,參數位於命令的參數之後非常重要,並且使用大括號而不是方括號來選擇它。

附:實際上,遺憾的是 LaTex 使用了一種相當不舒服的表示法(有點像 ALGOL 60 之類的東西)並且沒有做任何事情來使以類似 Python 的風格定義新命令成為可能。

答案1

假設您不想輸入(x,y)(x,y\mid a)出於某種原因。並且有充分的理由不這樣做:例如,您可能想要或被要求更改符號。硬連線輸入會使任務變得非常困難。

這個想法是輸入

\dependSet{x,y}
\dependSet{x,y|a}

但不影響最終輸出。輸入非常自然,避免了過多括號帶來的併發症。

我們該怎麼做呢?我們可以使用\NewDocumentCommand它的\SplitArgument功能。

\documentclass{article}
%\usepackage{xparse} % uncomment for older versions of LaTeX

\NewDocumentCommand{\dependSet}{>{\SplitArgument{1}{|}}m}{%
  \dependSetAux#1%
}
\NewDocumentCommand{\dependSetAux}{mm}{%
  \IfNoValueTF{#2}{% no | found
    (#1)%
  }{% found |
    (#1\mid #2)%
  }%
}

\begin{document}

$\dependSet{x}+\dependSet{x,y}+\dependSet{x,y|a}$

\end{document}

在此輸入影像描述

評論。

該命令\dependSet將其參數\dependSetAux作為兩個括號組傳遞。如果|初始參數中沒有,則第二個支撐組將{-NoValue-}可以進行測試,如圖所示。

如果您想變更最終格式,請按 操作\dependSetAux

可能更有效但不太簡單的程式碼是

\NewDocumentCommand{\dependSetAux}{mm}{%
  (#1\IfValueT{#2}{\mid #2})%
}

答案2

以下程式碼與您的規格完全相容,由完整範例給出:

\documentclass[onecolumn]{article}

\newcommand\ds[1]{%
    (#1)%
}

\begin{document}
    This can be used as text:
    
    \ds{x, y}
    
    \ds{x, y|a}
    
    It can also be used inline in math-mode: $\ds{x, y}$, see also: $\ds{x, y|a}$.
\end{document}

正如您所看到的,這個想法是將參數與功能分開。這比考慮您可能想要或可能不想使用的各種組合要容易。

在此輸入影像描述

相關內容