修剪字符串时意外丢失空格

修剪字符串时意外丢失空格

我正在尝试遵循给出的例子这里

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_ae_insertQuotedMatter_seq
\tl_new:N  \l_ae_insertQuotedMatter_trash_tl
\NewDocumentCommand{\removeQuotes}{m}
    {
      \seq_set_split:Nnn  \l_ae_insertQuotedMatter_seq {} {#1}
      \seq_pop_left:NN   \l_ae_insertQuotedMatter_seq \l_ae_insertQuotedMatter_trash_tl
      \seq_pop_right:NN  \l_ae_insertQuotedMatter_seq \l_ae_insertQuotedMatter_trash_tl
      \use:x  { \seq_map_function:NN \l_ae_insertQuotedMatter_seq \exp_not:n }
    }
\ExplSyntaxOff
\pagestyle{empty}
\begin{document}

\removeQuotes{"Hello World"}

\end{document}

但这超出了我的预期。空白部分消失了。

两个条件:(1) 我不希望必须编写\removeQuotes{"Hello\ World"}。另外,(2) 我不希望xstring为了完成这一项任务而加载整个新包(例如 )。

更新

我也尝试过类似的事情:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\removeQuotes}{m}
    {
      \tl_reverse:n { \tl_tail:n { \tl_reverse:n { \tl_tail:n { #1 } } } }
    }
\ExplSyntaxOff
\pagestyle{empty}
\begin{document}

\removeQuotes{"Hello World"}

\removeQuotes{"Hello\ World"}

\end{document}

但我收到了错误:

! Argument of \tl_tail:n has an extra }.
<inserted text> 
                \par 
l.12     \removeQuotes{"Hello World"}

? 

有什么建议么?

答案1

您的第二种方法可以通过生成所用命令的变体来解决:

\ExplSyntaxOn
\cs_generate_variant:Nn \tl_reverse:n { f }
\cs_generate_variant:Nn \tl_tail:n { f }
\NewDocumentCommand{\removeQuotes}{m}
    {
      \tl_reverse:f { \tl_tail:f { \tl_reverse:f { \tl_tail:f { #1 } } } }
    }
\ExplSyntaxOff

还有另一种方法:

\ExplSyntaxOn
\NewDocumentCommand{\removeQuotes}{m}
    {
     \tl_set:Nn \tl_tmpa_tl { #1 } 
     \tl_remove_all:Nn \tl_tmpa_tl { " }
     \tl_use:N \tl_tmpa_tl
    }
\ExplSyntaxOff

以下是 cgnieder 建议的方法:

\ExplSyntaxOn
\NewDocumentCommand{\removeQuotes}{m}
    {
     \__ellett_remove_quotes_aux:n { #1 }
    }
\cs_set:Npn \__ellett_remove_quotes_aux:n #1
 {
   \__ellett_remove_quotes_aux_i:w #1 \q_stop
 }
\cs_new:Npn \__ellett_remove_quotes_aux_i:w  "#1" \q_stop
 {
  #1
 }
\ExplSyntaxOff

答案2

该函数行为与观察结果一致的原因seq在于,它旨在去除项目“周围”的空格,而对于仅由空格组成的项目,这意味着将其完全删除。因此需要一种替代方法。

虽然标记列表函数可以做到这一点,但我可能会使用基于分隔参数的更传统的 TeX 方法。问题没有指定如果第一个和最后一个标记不是引号或引号嵌套在文本中时的行为。因此,以下内容可能并非在所有情况下都是“理想的”,但这是一个开始:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\removeQuotes}{m}
    { \ae_remove_quotes:n {#1} }
\cs_new:Npn \ae_remove_quotes:n #1
  { \__ae_remove_quotes:w #1 " " \q_stop }
\cs_new:Npn \__ae_remove_quotes:w #1 " #2 " #3 \q_stop
  {
    \tl_if_empty:nTF {#1}
      {#2}
      {#1}
  }
\ExplSyntaxOff
\pagestyle{empty}
\begin{document}

\removeQuotes{"Hello World"}

\removeQuotes{"Hello\ World"}

\end{document}

答案3

强制解决方案l3regex。未引用的材料将保持不变。

\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\removeQuotes}{m}
 {
  \ae_remove_quotes:n { #1 }
 }
\tl_new:N \l__ae_string_temp_tl

\cs_new_protected:Npn \ae_remove_quotes:n #1
 {
  \tl_set:Nn \l__ae_string_temp_tl { #1 }
  \regex_replace_once:nnN { \A \" (.*) \" \Z } { \1 } \l__ae_string_temp_tl
  \tl_use:N \l__ae_string_temp_tl
 }
\ExplSyntaxOff

\pagestyle{empty}
\begin{document}

\removeQuotes{"Hello World"}

\removeQuotes{"Hello\ World"}

\removeQuotes{Hello World}

\end{document}

在此处输入图片描述

相关内容