transformar el contenido de la variable en una representación textual dentro de un nuevo comando (usado luego como argumento opcional)

transformar el contenido de la variable en una representación textual dentro de un nuevo comando (usado luego como argumento opcional)

Pasé 8 horas resolviendo esto, hice algunos progresos pero ahora enfrento enormes dificultades con cosas textuales en látex. ¡Cualquier ayuda sería genial!

Mi objetivo: el todonotespaquete ofrece una opción en línea, que sin embargo se rompe si uno quiere usar \listoftodos, porque cosas en línea más complejas, como entornos de ecuaciones, no son adecuadas de alguna manera para el argumento del título. Una solución sencilla es establecer el argumento de título opcional de \todofix en algo como \todo[inline,caption={inline...}]{...}. La solución más difícil pero mejor sería, por ejemplo, cortar los primeros 20 caracteres del comentario en línea y ponerlos en el título. Esto es lo que probé y funciona.casi.

Concretamente, ya funciona siempre que la versión recortada no incluya caracteres especiales, al parecer. En el siguiente código encontrará %%%%%%%marcado el lugar decisivo. \StrLeft{\myraw}{10}Funciona, pero \StrLeft{\myraw}{20}ya se rompe.

Además, realicé algunas otras pruebas sobre cómo hacer que este contenido parezca palabra por palabra. Trabajan afuera \newcommand, pero no adentro. También lo sé \NewDocumentCommand{\myverb}{+v}{\texttt{#1}}desde xparse, sin embargo, tampoco encontré ninguna manera de lograr lo que quiero.

Esperamos su ayuda.

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

Salida del código para \StrLeft{\raw}{10}

Respuesta1

En lugar de intentar encontrar una solución palabra por palabra, aquí suelo tokcyclerecorrer la entrada de notas de tareas pendientes y procesarla para producir un título adecuado. El procesamiento para producir el título de la lista de tareas pendientes incluye:

  1. Los tokens cat 10, 11 y 12 se repiten en el título.

  2. el refuerzo {}se transforma en cat-12[]

  3. Los nombres de las macros se \stringeditan, sin embargo, \se reemplazan por un archivo /. Una macro cuenta como solo 1 token frente al permitido trunclim, independientemente de la longitud del nombre de la macro.

  4. Se ignoran los códigos de gato distintos de 0, 1, 2, 10, 11, 12.

  5. El numero total defichasen el título de la lista de tareas pendientes no excederá \thetrunclim - 1, teniendo en cuenta el hecho de que los nombres de macros solo contarán como un token único en este recuento.

  6. En el MWE que sigue, trunclimse establece en 20.

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

ingrese la descripción de la imagen aquí

Si trunclimse establece en 40, este es el resultado:

ingrese la descripción de la imagen aquí

información relacionada