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 todonotes
pacote 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 \todo
fix 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}
Responder1
Em vez de tentar encontrar uma solução literal, eu costumo tokcycle
percorrer 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:
os tokens cat 10, 11 e 12 são refletidos na legenda
o suporte
{}
é transformado em cat-12[]
os nomes das macros são
\string
editados, mas\
é substituído por um/
. Uma macro conta como apenas 1 token em relação ao permitidotrunclim
, independentemente do tamanho do nome da macro.Catcodes diferentes de 0, 1, 2 ,10 ,11 ,12 são ignorados.
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.No MWE a seguir,
trunclim
está definido como20
.
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}
Se trunclim
for definido como 40, este é o resultado: