나는 이 문제를 해결하는 데 8시간을 소비했고 약간의 진전을 이루었지만 이제는 라텍스의 내용을 그대로 사용하는 데 엄청난 어려움에 직면했습니다. 어떤 도움이라도 좋을 것입니다!
내 목표: 패키지는 인라인 옵션을 제공하지만 방정식 환경과 같은 더 복잡한 인라인 항목은 캡션 인수에 적합하지 않기 때문에 todonotes
사용하려는 경우 중단됩니다 . \listoftodos
쉬운 해결책은 \todo
fix의 선택적 캡션 인수를 \todo[inline,caption={inline...}]{...}
. 더 어렵지만 더 나은 해결책은 인라인 주석의 처음 20자를 잘라내어 캡션에 넣는 것입니다. 이것이 내가 시도한 것이고 작동하는 것입니다.거의.
구체적으로, 잘라낸 버전에 특수 문자가 포함되어 있지 않은 한 이미 작동하는 것 같습니다. 아래 코드에서 %%%%%%%
결정적인 장소를 표시하는 것을 찾을 수 있습니다. \StrLeft{\myraw}{10}
작동하지만 \StrLeft{\myraw}{20}
이미 중단되었습니다.
추가적으로 나는 이 콘텐츠를 말 그대로 만드는 방법에 대한 몇 가지 다른 시도를 했습니다. 그들은 밖에서 일 \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
일 노트 입력을 순환하고 처리하여 적절한 캡션을 생성하는 데 사용합니다. 할 일 목록 캡션을 생성하는 처리에는 다음이 포함됩니다.
cat 10, 11, 12 토큰이 캡션에 반영됩니다.
브레이싱은
{}
cat-12로 변환됩니다.[]
매크로 이름은
\string
ed로 표시되지만,\
은 로 대체됩니다/
. 매크로는trunclim
매크로 이름의 길이에 관계없이 허용되는 토큰 1개로만 계산됩니다.0, 1, 2 ,10 ,11 ,12 이외의 Catcode는 무시됩니다.
총 수토큰할 일 목록의 캡션은 을 초과하지 않으므로
\thetrunclim - 1
매크로 이름은 이 계산에서 단일 토큰으로만 계산됩니다.다음 MWE에서는
trunclim
가 로 설정됩니다20
.
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}
40으로 설정 하면 trunclim
결과는 다음과 같습니다.