使用诸如 之类的命令\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}
输出正如您所期望的。