如何拆分可选参数

如何拆分可选参数

使用诸如 之类的命令\usepackage,所有选项都可以在同一方括号内给出,仅使用逗号作为分隔符。

我想实现同样的事情,例如使用命令\coolphase,即 write \coolphase[-77,2]{nab}

我该怎么做 ?

我尝试过这个,但是没有用:

\NewDocumentCommand{\coolphasesplit}{>{\SplitArgument{4}{,}}o}{\coolphase#1}

平均能量损失

\documentclass{article}

\usepackage[linguistics]{forest}

\NewDocumentCommand{\coolphase}{
    O{-58}
    O{0}
    O{8}
    O{150}
    O{110}
    m}
{\draw[dotted,thick]([xshift=#1pt,yshift=#2pt]#6) arc[start angle=#4,end angle=#5,radius=#3cm];}


\begin{document}
    
\begin{forest}
    [ASP[\textit{subject}][Asp 
    [asp][POL
    [AdvP[\textit{non},roof]][Pol
    [pol, name=nab][aP
    [~][a′
    [a][root]]]]]]]
    \coolphase[-77][2]{nab}
\end{forest}
    
\end{document}

答案1

也许不用也能做到\ExplSyntaxOn,但是真的很麻烦。

使用\SplitArgument{4}{,},缺失的值将被特殊-NoValue-字符串替换,可以用 进行测试\tl_if_novalue:nTF

我们需要扩展测试才能\__krebs_coolphase:nnnnnn看到实际的参数。

\documentclass{article}

\usepackage[linguistics]{forest}

% this uses TikZ so it cannot go in \ExplSyntaxOn
\NewDocumentCommand{\coolphaseaux}{mmmmmm}{%
  \draw[dotted,thick]([xshift=#1pt,yshift=#2pt]#6) arc[start angle=#4,end angle=#5,radius=#3cm];
}

\ExplSyntaxOn
\NewDocumentCommand{\coolphase}{>{\SplitArgument{4}{,}}om}
 {
  \krebs_coolphase:nnnnnn #1{#2}
 }
\cs_new_protected:Nn \krebs_coolphase:nnnnnn
 {
  \__krebs_coolphase:eeeeen
   { \tl_if_novalue:nTF { #1 } { -58 } { #1 } }
   { \tl_if_novalue:nTF { #2 } {   0 } { #2 } }
   { \tl_if_novalue:nTF { #3 } {   8 } { #3 } }
   { \tl_if_novalue:nTF { #4 } { 150 } { #4 } }
   { \tl_if_novalue:nTF { #5 } { 110 } { #5 } }
   { #6 }
 }
% make an internal version of \coolphaseaux
\cs_set_eq:NN \__krebs_coolphase:nnnnnn \coolphaseaux
% generate the needed variant
\cs_generate_variant:Nn \__krebs_coolphase:nnnnnn { eeeee }
\ExplSyntaxOff

\begin{document}
    
\begin{forest}
    [ASP[\textit{subject}][Asp 
    [asp][POL
    [AdvP[\textit{non},roof]][Pol
    [pol, name=nab][aP
    [~][a'
    [a][root]]]]]]]
    \coolphase[-77,2]{nab}
\end{forest}
    
\end{document}

在此处输入图片描述

但是,如果您使用键值系统会更好,这样您就不需要记住选项的精确顺序。

\documentclass{article}

\usepackage[linguistics]{forest}

% this uses TikZ so it cannot go in \ExplSyntaxOn
\NewDocumentCommand{\coolphaseaux}{mmmmmm}{%
  \draw[dotted,thick]([xshift=#1pt,yshift=#2pt]#6) arc[start angle=#4,end angle=#5,radius=#3cm];
}

\ExplSyntaxOn
\NewDocumentCommand{\coolphase}{O{}m}
 {
  \group_begin:
  \keys_set:nn { krebs/coolphase } { #1 }
  \krebs_coolphase:VVVVVn
   \l__krebs_coolphase_x_tl
   \l__krebs_coolphase_y_tl
   \l__krebs_coolphase_sa_tl
   \l__krebs_coolphase_ea_tl
   \l__krebs_coolphase_r_tl
   {#2}
   \group_end:
 }
\keys_define:nn { krebs/coolphase }
 {
  x  .tl_set:N = \l__krebs_coolphase_x_tl,
  y  .tl_set:N = \l__krebs_coolphase_y_tl,
  sa .tl_set:N = \l__krebs_coolphase_sa_tl,
  ea .tl_set:N = \l__krebs_coolphase_ea_tl,
  r  .tl_set:N = \l__krebs_coolphase_r_tl,
  x  .initial:n = -58,
  y  .initial:n = 0,
  sa .initial:n = 8,
  ea .initial:n = 150,
  r  .initial:n = 110,
 }
% make an internal version of \coolphaseaux
\cs_set_eq:NN \krebs_coolphase:nnnnnn \coolphaseaux
% generate the needed variant
\cs_generate_variant:Nn \krebs_coolphase:nnnnnn { VVVVV }
\ExplSyntaxOff

\begin{document}
    
\begin{forest}
    [ASP[\textit{subject}][Asp 
    [asp][POL
    [AdvP[\textit{non},roof]][Pol
    [pol, name=nab][aP
    [~][a'
    [a][root]]]]]]]
    \coolphase[x=-77,y=2]{nab}
\end{forest}
    
\end{document}

你可以通过r=110,sa=150,x=-77,ea=110,y=2,而不必担心正确的顺序。

答案2

我知道使用 TeX 是可能的。类似下面的代码应该可以工作:

\def\coolphase(#1, #2){
    %function definition
}

答案3

使用 PythonTeX:

%! TEX program = lualatex
\documentclass{article}
\usepackage{pythontex}

\usepackage[linguistics]{forest}

\begin{pycode}
def coolphase(opt_parts, arg2):
    opt_default=[-58, 0, 8, 150, 110]
    if len(opt_parts)>len(opt_default):
        raise ValueError("Too many arguments")
    opt_parts+=opt_default[len(opt_parts):]  # fill in default arguments.
    # Now opt_parts = [77, 2, 8, 150, 110]

    print(
            r"\draw[dotted,thick]([xshift={xshift}pt,yshift={yshift}pt]{extra}) arc[start angle={start_angle},end angle={end_angle},radius={radius}cm];"
            .format(
                xshift=opt_parts[0],
                yshift=opt_parts[1],
                radius=opt_parts[2],
                start_angle=opt_parts[3],
                end_angle=opt_parts[4],
                extra=arg2
                )
            )
\end{pycode}
\NewDocumentCommand\coolphase{om}{\pyc{coolphase([#1],r"""#2""")}}


\begin{document}
    
\begin{forest}
    [ASP[\textit{subject}][Asp 
    [asp][POL
    [AdvP[\textit{non},roof]][Pol
    [pol, name=nab][aP
    [~][a′
    [a][root]]]]]]]
    \coolphase[-77,2]{nab}
\end{forest}
    
\end{document}

输出正如您所期望的。

相关内容