преобразовать содержимое переменной в дословное представление внутри новой команды (используется затем как необязательный аргумент)

преобразовать содержимое переменной в дословное представление внутри новой команды (используется затем как необязательный аргумент)

Я потратил 8 часов на решение этой проблемы, добился определенного прогресса, но теперь столкнулся с огромными трудностями с дословным текстом в латексе. Любая помощь была бы здоровой!

Моя цель: todonotesпакет предлагает встроенную опцию, которая, однако, ломается, если кто-то хочет использовать \listoftodos, потому что более сложные встроенные вещи, такие как среды уравнений, не подходят для аргумента заголовка. Простое решение — установить необязательный аргумент заголовка исправления \todoна что-то вроде\todo[inline,caption={inline...}]{...} . Более сложным, но лучшим решением было бы, например, вырезать первые 20 символов встроенного комментария и поместить его в заголовок. Это то, что я попробовал, и это работаетпочти.

Конкретно, это уже работает, пока обрезанная версия не содержит никаких специальных символов, как кажется. В коде ниже вы найдете %%%%%%%маркировку решающего места. \StrLeft{\myraw}{10}работает, но \StrLeft{\myraw}{20}уже ломается.

Дополнительно я вставил несколько других попыток, как сделать этот контент похожим на verbatime. Они работают снаружи \newcommand, но не внутри. Я также знаю о \NewDocumentCommand{\myverb}{+v}{\texttt{#1}}из xparse, однако и здесь я не нашел способа добиться того, что я хочу.

Надеюсь на вашу помощь.

\documentclass{article}

\usepackage{xstring}
\usepackage{amsmath}
\usepackage{comment}
\usepackage{todonotes}
\usepackage{verbdef}


% TODO this still does not work for special sequences! kind of escape inbetween?
\newcommand{\MYTODO}[2][]{%
% makes a raw approximation and cut - this must be called within the same newcommand and cannot be outsourced for some reason I do not fully understand:
\scancs[0]\myraw{#2}
%equivalent to:
%\StrExpand[0]{#2}{\h}
%\def\raw{\detokenize\expandafter{\h}}
\StrLeft{\myraw}{10}[\myleft]  %%%%%%% changing this number to for example 20 breaks the code %%%%%%%
%
% this is the essential thing we want:
%\expandafter\verbdef\expandafter\variable\expandafter+\myleft+    %%%breaks immedidiately
%\todo[inline, caption={\string\myleft}, #1]{#2}   %%%breaks immediately
%\todo[inline, caption={\texttt{\myleft}}, #1]{#2}  %%%breaks also for surroundings
\todo[inline, caption={\myleft}, #1]{#2}
}


\begin{document}
\listoftodos
\bigskip

\MYTODO[author=me]{ABCDEF}

\MYTODO{%
but what if
\begin{align*}
    x^2
\end{align*}
}


\bigskip
%I tested here some ways to get verbatime output inside a variable, but both do not work in commands
\def\toverb{this works|, but only outside a newcommand.}
\expandafter\verb\expandafter+\toverb+
\expandafter\verbdef\expandafter\fromverb\expandafter+\toverb+
\fromverb

\end{document}

Вывод кода для \StrLeft{\raw}{10}

решение1

Вместо того, чтобы пытаться работать над дословным решением, я здесь использую tokcycleциклический просмотр вашего ввода заметки о делах и обрабатываю его для создания подходящей подписи. Обработка для создания подписи списка дел включает:

  1. Токены категорий 10, 11 и 12 отражены в подписи

  2. распорка {}трансформируется в кат-12[]

  3. Имена макросов \stringредактируются, однако заменяется \на /. Макрос считается только 1 токеном по сравнению с разрешенным trunclim, независимо от длины имени макроса.

  4. Коды, отличные от 0, 1, 2, 10, 11, 12, игнорируются.

  5. Общее количествожетоныв заголовке списка дел не будет превышать \thetrunclim - 1, учитывая тот факт, что имена макросов будут учитываться только как один токен при подсчете.

  6. В следующем MWE trunclimустановлено значение 20.

МВЭ:

\documentclass{article}
\usepackage{amsmath}
\usepackage{comment}
\usepackage{todonotes}
\usepackage{tokcycle}
\newcounter{trunclength}
\def\trunclim{20}
\makeatletter
\newcommand\myleft[1]{%
  \setcounter{trunclength}{0}%
  \tokcycle
  {\stepcounter{trunclength}%
   \tctestifnum{\thetrunclength<\trunclim}{%
     \tctestifcatnx A##1{\addcytoks{##1}}{%
     \tctestifcatnx 0##1{\addcytoks{##1}}{%
     }}%
   }{}}%
  {\processtoks{[##1]}}%
  {\stepcounter{trunclength}%
    \tctestifnum{\thetrunclength<\trunclim}{%
    \addcytoks{/}%
    \addcytoks[2]{\expandafter\@gobble\string##1}}{}}%
  {\stepcounter{trunclength}%
    \tctestifnum{\thetrunclength<\trunclim}{\addcytoks{##1}}{}}%
  {#1}%
}
\makeatother
% TODO this still does not work for special sequences! kind of escape inbetween?
\newcommand{\MYTODO}[2][]{%
  \myleft{#2}\todo[inline, caption={\the\cytoks}, #1]{#2}
}
\begin{document}
\listoftodos
\bigskip
\MYTODO[author=me]{ABCDEF}
\MYTODO{%
but what if
\begin{align*}
    x^2
\end{align*}
}
\end{document}

введите описание изображения здесь

Если trunclimустановлено значение 40, то результат будет следующим:

введите описание изображения здесь

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