我正在使用 Texmaker 和 Pdftex 编写自定义包。我有一个函数,如果我提供的分隔符不好或不合适,我想将某个分隔符更改为用户希望的任何分隔符。示例如下。
我有一个 Switch Case 函数,我希望能够使用-
预定义的分隔符更改分隔符“”,或者如果碰巧需要所有提供的分隔符,则使用用户输入的分隔符更改分隔符“”。
最好的情况是删除所有预定义的分隔符并允许用户以\usepackage[SwitchCaseDelimiter=""]{Customs}
这种方式输入和使用它。
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{Customs}[2019/16/12 Custom Function Package]
\RequirePackage{xparse}
%\RequirePackage{tikz}
%\RequirePackage{pdfpages}
%\RequirePackage{graphicx}
%\RequirePackage{capt-of}
%\RequirePackage{caption}
%\RequirePackage{geometry}
%\RequirePackage{catchfile}
\newcommand{\SCdelim}{,}
\DeclareOption{Semicolon}{\renewcommand{\SCdelim}{;}}
\DeclareOption{Colon}{\renewcommand{\SCdelim}{:}}
\DeclareOption{Exclaimation}{\renewcommand{\SCdelim}{!}}
\DeclareOption{Period}{\renewcommand{\SCdelim}{.}}
\DeclareOption{Minus}{\renewcommand{\SCdelim}{-}}
\DeclareOption{Equals}{\renewcommand{\SCdelim}{=}}
\DeclareOption{Carrot}{\renewcommand{\SCdelim}{^}}
\DeclareOption{LeftArrow}{\renewcommand{\SCdelim}{<}}
\DeclareOption{RightArrow}{\renewcommand{\SCdelim}{>}}
\DeclareOption{Arrows}{\renewcommand{\SCdelim}{<>}}
\DeclareOption{Other}{\renewcommand{\SCdelim}[1]{#1}}
\ProcessOptions\relax
\makeatletter
\newcommand\SwitchCase[2]{%
\def\tmpa{#1}%
\@for\tmp:=#2\do{\expandafter\zz@switch\tmp\zz@switch}%
}
\def\zz@switch#1-#2\zz@switch{% ideally change the delimiter in this line
\def\tmpb{#1}%
\ifx\tmpa\tmpb#2\fi}
\makeatother
\endinput
我想要做的事情如下:
\def\zz@switch#1\SCDelim#2\zz@switch{% ideally change the delimiter in this line
\def\tmpb{#1}%
\ifx\tmpa\tmpb#2\fi}
过多的标头只是为了显示包中使用了哪些其他标头。包中还有大约 5 或 6 个函数,但它们与问题无关。我只包含了我所需的包,这样任何答案都不会与已在使用的包发生冲突或错误。
PS:对于任何不当的措辞或奇怪的编码,我深表歉意。
答案1
您正在使用expl3
,因此最好充分利用其功能。
\ProvidesPackage{customs}
\RequirePackage{expl3,xparse,l3keys2e}
\ExplSyntaxOn
\keys_define:nn { customs }
{
Other .tl_set:N = \l__customs_delim_tl,
Comma .code:n = \keys_set:nn { customs } { Other = {,} },
Semicolon .code:n = \keys_set:nn { customs } { Other = ; },
Exclamation .code:n = \keys_set:nn { customs } { Other = ! },
Period .code:n = \keys_set:nn { customs } { Other = . },
Hyphen .code:n = \keys_set:nn { customs } { Other = - },
Equals .code:n = \keys_set:nn { customs } { Other = {=} },
Caret .code:n = \keys_set:nn { customs } { Other = ^ },
LeftArrow .code:n = \keys_set:nn { customs } { Other = < },
RightArrow .code:n = \keys_set:nn { customs } { Other = > },
Arrows .code:n = \keys_set:nn { customs } { Other = <> },
Colon .code:n = \tl_set:Nx \l__customs_delim_tl { \token_to_str:N : },
}
\keys_set:nn { customs } { Comma }
\ProcessKeysOptions { customs }
\seq_new:N \l__customs_switch_seq
\cs_generate_variant:Nn \seq_set_split:Nnn { NV }
\NewDocumentCommand{\SwitchCase}{mm}
{
\seq_set_split:NVn \l__customs_switch_seq \l__customs_delim_tl { #2 }
\seq_if_in:NnT \l__customs_switch_seq { #1 } { #1 }
}
\ExplSyntaxOff
\endinput
这里有一些测试文件。
1. 没有选择
\documentclass{article}
\usepackage{customs}
\begin{document}
X\SwitchCase{abc}{x,abc,d}X
X\SwitchCase{abc}{x-abc-d}X
X\SwitchCase{abc}{xyyabcyyd}X
\end{document}
- 选项
Hyphen
\documentclass{article}
\usepackage[Hyphen]{customs}
\begin{document}
X\SwitchCase{abc}{x,abc,d}X
X\SwitchCase{abc}{x-abc-d}X
X\SwitchCase{abc}{xyyabcyyd}X
\end{document}
- 选项
Other
\documentclass{article}
\usepackage[Other=yy]{customs}
\begin{document}
X\SwitchCase{abc}{x,abc,d}X
X\SwitchCase{abc}{x-abc-d}X
X\SwitchCase{abc}{xyyabcyyd}X
\end{document}