Я потратил 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}
решение1
Вместо того, чтобы пытаться работать над дословным решением, я здесь использую tokcycle
циклический просмотр вашего ввода заметки о делах и обрабатываю его для создания подходящей подписи. Обработка для создания подписи списка дел включает:
Токены категорий 10, 11 и 12 отражены в подписи
распорка
{}
трансформируется в кат-12[]
Имена макросов
\string
редактируются, однако заменяется\
на/
. Макрос считается только 1 токеном по сравнению с разрешеннымtrunclim
, независимо от длины имени макроса.Коды, отличные от 0, 1, 2, 10, 11, 12, игнорируются.
Общее количествожетоныв заголовке списка дел не будет превышать
\thetrunclim - 1
, учитывая тот факт, что имена макросов будут учитываться только как один токен при подсчете.В следующем 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, то результат будет следующим: