변수 내용을 newcommand 내에서 축어적 표현으로 변환합니다(이후 선택적 인수로 사용됨).

변수 내용을 newcommand 내에서 축어적 표현으로 변환합니다(이후 선택적 인수로 사용됨).

나는 이 문제를 해결하는 데 8시간을 소비했고 약간의 진전을 이루었지만 이제는 라텍스의 내용을 그대로 사용하는 데 엄청난 어려움에 직면했습니다. 어떤 도움이라도 좋을 것입니다!

내 목표: 패키지는 인라인 옵션을 제공하지만 방정식 환경과 같은 더 복잡한 인라인 항목은 캡션 인수에 적합하지 않기 때문에 todonotes사용하려는 경우 중단됩니다 . \listoftodos쉬운 해결책은 \todofix의 선택적 캡션 인수를 \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}

\StrLeft{\raw}{10}에 대한 코드 출력

답변1

저는 말 그대로 해결 방법을 시도하기보다는 할 tokcycle일 노트 입력을 순환하고 처리하여 적절한 캡션을 생성하는 데 사용합니다. 할 일 목록 캡션을 생성하는 처리에는 다음이 포함됩니다.

  1. cat 10, 11, 12 토큰이 캡션에 반영됩니다.

  2. 브레이싱은 {}cat-12로 변환됩니다.[]

  3. 매크로 이름은 \stringed로 표시되지만, \은 로 대체됩니다 /. 매크로는 trunclim매크로 이름의 길이에 관계없이 허용되는 토큰 1개로만 계산됩니다.

  4. 0, 1, 2 ,10 ,11 ,12 이외의 Catcode는 무시됩니다.

  5. 총 수토큰할 일 목록의 캡션은 을 초과하지 않으므로 \thetrunclim - 1매크로 이름은 이 계산에서 단일 토큰으로만 계산됩니다.

  6. 다음 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결과는 다음과 같습니다.

여기에 이미지 설명을 입력하세요

관련 정보