我想定义一个接受坐标类参数的环境(1,2)
。我考虑两种不同的调用方案:
\begin{myenv}(mandatory coordinate)[optional](optional coordinate)
\begin{myenv}[optional](mandatory coordinate)(optional coordinate)
我需要关于如何实现它们的建议。我使用TikZ
so 来表示我想要使用的可选参数pgfkeys
,但我不知道如何使用括号指定参数。
答案1
这相当容易xparse
。
\usepackage{xparse}
\NewDocumentEnvironment{myenv}{ o r() d() }
{<begin code>}
{<end code>}
您可以测试第一个可选参数是否用
\IfValueTF{#1}
{<code with optional argument expressed>}
{<code with optional argument not expressed>}%
或者,如果使用 ,则两个分支可以交换\IfNoValueTF{#1}
。对于#3
(用括号分隔的坐标对),情况也类似。
有了这一系列参数,您就拥有一个可选参数(用括号括起来)、一个强制坐标参数和一个可选坐标参数。这种方式可能更简单。
如果要在未表达可选参数的情况下提供默认值,请使用类似
\NewDocumentEnvironment{myenv}{ O{default} r() D(){0,0} }
其中大写字母表示使用默认值(在下面的括号列表中指定)。在这种情况下,您不需要使用\IfValueTF
或\IfNoValueTF
。
答案2
\documentclass{article}
\makeatletter
\protected\def\myenva{\@ifnextchar[\myenva@A{\myenva@A[]}}
\def\myenva@A[#1]#2{\@ifnextchar({\myenva@B[{#1}]{#2}}{\myenva@B[{#1}]{#2}(0,0)}}
\def\myenva@B[#1]#2(#3,#4){%
\par myenva[#1]\{#2\}(#3,#4)\par}
\protected\def\myenvb#1{\@ifnextchar[{\myenvb@A{#1}}{\myenvb@A{#1}[]}}
\def\myenvb@A#1[#2]{\@ifnextchar({\myenvb@B{#1}[{#2}]}{\myenvb@B{#1}[{#2}](0,0)}}
\def\myenvb@B#1[#2](#3,#4){%
\par myenvb\{#1\}[#2](#3,#4)\par}
\makeatother
\begin{document}
\begin{myenva}{one}
\end{myenva}
\begin{myenva}[opt]{one}
\end{myenva}
\begin{myenva}{one}(9,9)
\end{myenva}
\begin{myenva}[opt]{one}(9,9)
\end{myenva}
\begin{myenvb}{one}
\end{myenvb}
\begin{myenvb}{one}[opt]
\end{myenvb}
\begin{myenvb}{one}(9,9)
\end{myenvb}
\begin{myenvb}{one}[opt](9,9)
\end{myenvb}
\end{document}
请注意,在两种情况下,这都使用相同的基本函数,[]
在可选情况和(0,0)
坐标情况下提供默认值。但是,如果您希望函数执行与不[]
提供完全不同的事情,则不必强制执行,只需替换{\myenva@A[]}
并\myenva@C
定义该命令以执行您想要的任何操作,而不是省略与提供等效的参数[]
。
答案3
不确定这是否是你想要的
\documentclass{article}
\parindent 0in\parskip 1em
\usepackage{readarray}
\begin{document}
\newenvironment{myenv}[1]{%
\getargsC{#1}%
\def\coordone{\argi}%
\if2\narg\def\coordtwo{\argii}\else\def\coordtwo{Undefined}\fi%
First: \coordone\\
Second: \coordtwo}{}
\begin{myenv}{(1,2)}\end{myenv}
\begin{myenv}{(1,2) (5,7)}\end{myenv}
\end{document}