这个问题具体是关于可扩展版本的\IfStrEqCase
(具有多个匹配项)的修改了 \IfStrEqCase,每个案例有多个匹配项。
然而,如果这是xy问题,我真正的问题是能够输出 PDF 中输出的纯 ascii 版本。我已经能够重新定义我的大多数其他宏来获得所需的结果,但在这个宏上却遇到了困难。因此,我愿意接受其他不需要我将所有宏重新定义为可扩展版本的解决方案。
下面的 MWE 在 PDF 中产生了所需的结果:
但.txt文件包含:
Intro text... \par \IfStringCaseXO {case 4}{{{case 1}{case 3}{case 4}}{some long text which is identical for case 1, case 3 and case 4.} {{case 2}{case 5}}{other text for case 2 and case 5.}}\par Conclusion text...
但我希望这是
Intro text... some long text which is identical for case 1, case 3 and case 4. Conclusion text...
笔记:
由于
\DeclareExpandableDocumentCommand
/\RenewExpandableDocumentCommand
似乎不允许使用可选的最后一个参数,因此修改后的版本\RenewExpandableDocumentCommand{\IfStringCaseXO}
(下面注释掉)具有不同的参数规范。虽然这通常可能是一个问题,但我计划\IfStringCaseXO
在这种特定模式下使用时不使用可选参数。但是,如果有办法允许使用尾随可选参数,那就太好了。这是一个单独的问题,但万一解决方案很简单:如何
\par
在输出中消除?我当然可以使用外部脚本来做到这一点,但如果在输出内容之前很容易做到这一点那就太好了。
代码:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
%% --------------------------------------------------------------------------
%% https://tex.stackexchange.com/questions/350815/modified-ifstreqcase-with-multiple-matches-per-case
\cs_new_protected:Nn \grill_str_multicase:nnTF
{
\seq_set_split:Nnn \l__grill_str_multicase_cases_seq { } { #2 }
\tl_clear:N \l__grill_str_multicase_cases_tl
\int_step_inline:nnnn { 1 } { 2 } { \seq_count:N \l__grill_str_multicase_cases_seq }
{
\seq_set_split:Nnx \l__grill_str_multicase_subcases_seq { }
{ \seq_item:Nn \l__grill_str_multicase_cases_seq { ##1 } }
\seq_map_inline:Nn \l__grill_str_multicase_subcases_seq
{
\tl_put_right:Nx \l__grill_str_multicase_cases_tl
{
{\exp_not:n{####1}}{\seq_item:Nn \l__grill_str_multicase_cases_seq { ##1 + 1}}
}
}
}
\str_case:nVTF { #1 } \l__grill_str_multicase_cases_tl { #3 } { #4 }
}
\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }
\cs_new_protected:Nn \grill_str_multicase:nn
{
\grill_str_multicase:nnTF { #1 } { #2 } { } { }
}
\cs_new_protected:Nn \grill_str_multicase:nnT
{
\grill_str_multicase:nnTF { #1 } { #2 } { #3 } { }
}
\cs_new_protected:Nn \grill_str_multicase:nnF
{
\grill_str_multicase:nnTF { #1 } { #2 } { } { #3 }
}
\cs_generate_variant:Nn \grill_str_multicase:nn { o }
\cs_generate_variant:Nn \grill_str_multicase:nnF { o }
\NewDocumentCommand{\IfStringCaseX}{mmo}
{
\IfNoValueTF{#3}
{ \grill_str_multicase:nn { #1 } { #2 } }
{ \grill_str_multicase:nnF { #1 } { #2 } { #3 } }
}
\NewDocumentCommand{\IfStringCaseXO}{mmo}
{
\IfNoValueTF{#3}
{ \grill_str_multicase:on { #1 } { #2 } }
{ \grill_str_multicase:onF { #1 } { #2 } { #3 } }
}
%% --------- End of definitions form https://tex.stackexchange.com/questions/350815
%% --------------------------------------------------------------------------
\newcommand{\RedefineIfStringCaseXO}{%
%\RenewExpandableDocumentCommand{\IfStringCaseXO}{mm}
%{
% %% ??????
%}
}%
\ExplSyntaxOff
\DeclareExpandableDocumentCommand{\ConditionalText}{m}{%
Intro text...
\IfStringCaseXO{#1}{%
{{case 1}{case 3}{case 4}}{%
some long text which is identical for case 1, case 3 and case 4.%
}
{{case 2}{case 5}}{%
other text for case 2 and case 5.%
}%
%% Since expandable macros can't have an optional last parameter,
}%%[{Error: Unknown parameter ``#1'' to ConditionalText}]%
\par Conclusion text...%
}
\newwrite\tempfile
\AtEndDocument{\immediate\closeout\tempfile}
\newcommand{\WriteToTextFile}[1]{%
\RedefineIfStringCaseXO%
\let\par\relax% <--- Don't want \par in the output file.
\edef\OutputText{#1}%
\immediate\openout\tempfile=\jobname.txt%
\immediate\write\tempfile{\OutputText}%
\immediate\closeout\tempfile%
}%
\begin{document}
\def\casesix{case 4}
\ConditionalText{\casesix}%% PDF output is fine
\WriteToTextFile{\ConditionalText{\casesix}}%% Desire ASCII output here.
\end{document}