Как обрезать пробелы, не расширяя то, что находится внутри в expl3?

Как обрезать пробелы, не расширяя то, что находится внутри в expl3?

Рассмотрим следующую схему:

\NewDocumentCommand{\mycommand}{m}{
    \myinternalcommand:n{#1}
}
\cs_new:Nn \myinternalcommand:n{
    \tl_if_single:nTF{#1}{TRUE}{FALSE}
}

и скажем, я хочу делать разные вещи в зависимости от того, \mycommandполучает ли я control sequenceв качестве входных данных или нет: \mycommand{\mycs}должен делать одно, а \mycommand{abcde}должен делать другое. Я хотел бы, в частности, \mycommand{ \mycs }работать.

Мой вопрос: как использовать \tl_trim_spacesдля обрезки пробелов вокруг управляющих последовательностей... не расширяя управляющую последовательность? (в шаблоне выше :nможно изменить форму аргументов)

Примечание: даже если это приложение плохое (в таком случае я хотел бы знать, почему), меня все равно интересует изначальный вопрос: как обрезать пробелы, не расширяя то, что находится внутри?

решение1

При создании команды документа обычно используется ltcmdинтерфейс процессора:

\ExplSyntaxOn
\NewDocumentCommand \mycommand { > { \TrimSpaces } m }
  {
    \myinternalcommand:n {#1}
  }

Если вы хотите обрезать пробелы на уровне кода, как описано в , interface3вы можете положиться на тот факт, что \tl_trim_spaces:nэто предотвращает дальнейшее расширение, например,

\cs_new:Npn \my_pkg_fn:n #1
  {
    \use:e { \tl_trim_spaces:n {#1} }
  }
\my_pkg_fn:n { ~ \foo }

оставит точно \fooво входном потоке.

Из вопроса следует, что вы хотели бы сделать что-то вроде

\cs_new:Npn \myinternalcommand:n #1
  {
    \myinternalcommand_aux:e {#1}
  }
\cs_new:Npn \myinternalcommand_aux:n #1
  {
    \tl_if_single:nTF{#1}{TRUE}{FALSE}
  }
\cs_generate_variant:Nn \myinternalcommand_aux:n { e }

хотя на самом деле кажется, что вы беспокоитесь оуровень документавходные пробелы ...

Связанный контент