transformar conteúdo variável em representação literal dentro de um novo comando (usado então como argumento opcional)

transformar conteúdo variável em representação literal dentro de um novo comando (usado então como argumento opcional)

Passei 8 horas resolvendo isso, fiz alguns progressos, mas agora enfrento enormes dificuldades com material literal em látex. Qualquer ajuda seria ótimo!

Meu objetivo: o todonotespacote oferece uma opção inline, que, no entanto, quebra se alguém quiser usar \listoftodos, porque coisas inline mais complexas, como ambientes de equações, não são adequadas de alguma forma para o argumento da legenda. Uma solução fácil é definir o argumento de legenda opcional de \todofix como algo como \todo[inline,caption={inline...}]{...}. A solução mais difícil, porém melhor, seria, por exemplo, cortar os primeiros 20 caracteres do comentário embutido e colocá-los na legenda. Isso é o que eu tentei e que funcionaquase.

Concretamente, já funciona desde que a versão cortada não inclua caracteres especiais, ao que parece. No código abaixo você encontra %%%%%%%a marcação do local decisivo. \StrLeft{\myraw}{10}funciona, mas \StrLeft{\myraw}{20}já quebra.

Além disso, fiz alguns outros testes sobre como tornar esse conteúdo semelhante ao literal. Eles trabalham fora \newcommand, mas não dentro. Também conheço \NewDocumentCommand{\myverb}{+v}{\texttt{#1}}de xparse, porém também aqui não encontrei como conseguir o que desejo.

Mal posso esperar pela sua ajuda.

\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}

Saída do código para \StrLeft{\raw}{10}

Responder1

Em vez de tentar encontrar uma solução literal, eu costumo tokcyclepercorrer a entrada da sua nota de tarefas e processá-la para produzir uma legenda adequada. O processamento para produzir a legenda da lista de tarefas inclui:

  1. os tokens cat 10, 11 e 12 são refletidos na legenda

  2. o suporte {}é transformado em cat-12[]

  3. os nomes das macros são \stringeditados, mas \é substituído por um /. Uma macro conta como apenas 1 token em relação ao permitido trunclim, independentemente do tamanho do nome da macro.

  4. Catcodes diferentes de 0, 1, 2 ,10 ,11 ,12 são ignorados.

  5. O número total defichasna legenda da lista de tarefas não excederá \thetrunclim - 1, permitindo o fato de que os nomes das macros contarão apenas como um único token nesta contagem.

  6. No MWE a seguir, trunclimestá definido como 20.

O MWE:

\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}

insira a descrição da imagem aqui

Se trunclimfor definido como 40, este é o resultado:

insira a descrição da imagem aqui

informação relacionada