自定义包参数

自定义包参数

我正在使用 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}
  1. 选项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}
  1. 选项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}

输出 1

在此处输入图片描述

输出 2

在此处输入图片描述

输出 3

在此处输入图片描述

相关内容