我最近问过 如何将命令和环境从 LaTeX2e 迁移到 LaTeX3?[XeTeX]
虽然这个问题很好,但答案可能相当复杂,需要一些时间才能有效回答(在撰写本文时,没有答案,但是,有几个有用的评论)。
这个问题解决了我在使用 LaTeX3 的过程中遇到的一个障碍。
使用xparse
LaTeX3 语法,我定义:
- 持有值的命令(作为变量的功能)
- 重置该值的用户命令
- 使用 xparse 的条件语句
\IfEq
语法\IfEq
:
\IfEq{〈stringA〉}{〈stringB〉}{〈true〉}{〈false〉}
来自xparse
手册:
在极少数情况下,使用完全可扩展的参数抓取器创建函数可能会很有用。为了支持这一点,xparse 可以创建可扩展函数以及通常的健壮函数。这对函数接受的参数的性质及其实现的代码施加了许多限制。只有在绝对必要时才应使用此功能;如果您不了解何时可能这样做,请不要使用这些函数!
请注意,版本“发布于 2014/11/25”中有一个拼写错误:*occasions*
更新的代码
据我了解, \jkoclass 需要扩展,但不会使用 进行扩展\NewDocumentCommand
。我应该使用 吗\DeclareExpandableDocumentCommand
?
我意识到我的示例代码并没有按照我最初提出问题时应该的方式编写。这是我缩进的代码:
\documentclass{article}
\usepackage{xparse}
\usepackage{xstring}
\DeclareExpandableDocumentCommand{\jkoclass}{}{I}
\NewDocumentCommand{\jkosetclass}{ m }{\RenewDocumentCommand{\jkoclass}{}{#1}}
\NewDocumentCommand{\jkoimagepath}{}{
\IfEq{\jkoclass}{I}
{Value is I}
{Value is NOT I}
}
\begin{document}
\jkoimagepath{} (should result in: Value is I)
\jkosetclass{II}
\jkoimagepath{} (should result in: Value is NOT I)
\end{document}
原始问题代码
\documentclass{article}
\usepackage{xparse}
\usepackage{xstring}
\NewDocumentCommand{\jkoclass}{ m }{I}
\NewDocumentCommand{\setjkoclass}{ m }{\RenewDocumentCommand{\jkoclass}{m}{#1}}
\IfEq{\jkoclass}{I} %<-- \jkoclass is protected automatically by the xparse definition and will therefore not be expand as desired.
{Class is I}
{Class is II}
\begin{document}
\setjkoclass{II}
\jkoclass{}
\end{document}
答案1
您采取了错误的方法;您当然可以使用用户级命令\jkoclass
来打印某些内容,但如果它打印的是变量数据,则应该为这些数据分配自己的变量。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
% allocate a (global) variable
\tl_new:N \g_macmadness_jko_class_tl
% initialize the value
\tl_gset:Nn \g_macmadness_jko_class_tl { I }
% define a user level command for printing the value
\NewDocumentCommand{\jkoclass}{}
{
\tl_use:N \g_macmadness_jko_class_tl
}
% define a user level command for changing the value
\NewDocumentCommand{\setjkoclass}{m}
{
\tl_gset:Nn \g_macmadness_jko_class_tl { #1 }
}
\ExplSyntaxOff
假设现在您想要定义一个新的用户级命令来打印一些取决于是否包含变量的内容I
。
在编程环境中添加
\NewDocumentCommand{\jkoclassifI}{}
{
\tl_if_eq:VnTF \g_macmadness_jko_class_tl { I }
{ Class~is~I } % true branch
{ Class~is~not~I } % false branch
}
\cs_generate_variant:Nn \tl_if_eq:nnTF { V }
最后一条指令是为了在编程环境中提供标记列表相等性检查函数的变体,该变体以标记列表变量作为其第一个参数。
编程环境中输出中的空格必须用 指定~
,因为普通空格会被忽略。