라벨 정의 수정

라벨 정의 수정

\label페이지 및 .aux 파일 외에도 .aux 파일에 장을 저장하도록 명령을 수정하려고 합니다 \@currentlabel. 다음을 시도했지만 작동하지 않습니다.

\documentclass{book}
\usepackage{amsthm}
\makeatletter
\def\@newl@bel#1#2#3{%
    \@ifundefined{#1@#2}%
    \relax
    {\gdef \@multiplelabels {%
            \@latex@warning@no@line{There were multiply-defined labels}}%
        \@latex@warning@no@line{Label `#2' multiply defined}}%
    \global\@namedef{#1@#2}{#3}}
\def\newlabel{\@newl@bel r}
\@onlypreamble\@newl@bel
\let \@multiplelabels \relax
\def\label#1{\@bsphack
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\@currentlabel}{\thepage}{\thechapter}}}%
\@esphack}
\def\refstepcounter#1{\stepcounter{#1}%
\protected@edef\@currentlabel
{\csname p@#1\endcsname\csname the#1\endcsname}%
}

\def\ref#1{\expandafter\@setref\csname r@#1\endcsname\@firstofthree{#1}}
\def\pageref#1{\expandafter\@setref\csname r@#1\endcsname\@secondofthree{#1}}
\def\chapref#1{\expandafter\@setref\csname r@#1\endcsname\@thirdofthree{#1}}
\makeatother
\theoremstyle{plain}
\newtheorem{theorem}{Theorem}
\begin{document}
\setcounter{page}{3}
\setcounter{chapter}{1}
\chapter{abc}
\begin{theorem}\label{theo}abc\end{theorem}
Theorem \ref{theo} in chapter \chapref{theo}, page \pageref{theo} says that abc.
\end{document}

새 명령은 \chapref인식되지 않더라도 잘 작동하며, while \ref\pageref의 연결을 반환 \@currentlabel \thepage합니다 thechapter.

\@newl@bel나는 내가 뭘 잘못하고 있는지 확인하기 어렵게 만드는 변수가 무엇을 의미하는지 실제로 이해하지 못합니다 .

댓글에서 언급했듯이 참조 패키지가 필요하지 않은 솔루션에 관심이 있습니다. 나는 좋은 해결책을 알고 있습니다이 질문, 하지만 \newlabel을 수정하여 수행할 수 있는지 알고 싶습니다.

답변1

zref새로운 chapterprop속성을 정의하고 그 다음을 저장하는 것은 매우 쉽습니다 \thechapter.

지불해야 할 대가는 , \zref그리고 \zlabel입니다 \zpageref.

\documentclass{book}
\usepackage{amsthm}
\usepackage[user]{zref}


\makeatletter
\zref@newprop{chapterprop}{\thechapter}
\zref@addprops{main}{chapterprop}
\newcommand{\chapref}[1]{\zref@extract{#1}{chapterprop}}%\expandafter\@setref\csname r@#1\endcsname\@thirdofthree{#1}}
\makeatother
\theoremstyle{plain}
\newtheorem{theorem}{Theorem}
\begin{document}
\setcounter{page}{3}
\setcounter{chapter}{1}
\chapter{abc}
\begin{theorem}\zlabel{theo}abc\end{theorem}
Theorem \zref{theo} in chapter \chapref{theo}, page \zpageref{theo} says that abc.
\end{document}

업데이트*ref관련 패키지 없이 해킹 \label과 명령어만 제공하면 \ref됩니다 .\pageref\@...ofthree

\documentclass{book}
\usepackage{amsthm}
\makeatletter

\def\label#1{\@bsphack
  \protected@write\@auxout{}%
  {\string\newlabel{#1}{{\@currentlabel}{\thepage}{\thechapter}}}%
  \@esphack}

\long\def\@firstofthree#1#2#3{#1}
\long\def\@secondofthree#1#2#3{#2}
%\long\def\@threeofthree#1#2#3{#3}% Is defined in `latex.ltx` already

\def\ref#1{\expandafter\@setref\csname r@#1\endcsname\@firstofthree{#1}}
\def\pageref#1{\expandafter\@setref\csname r@#1\endcsname
                                   \@secondofthree{#1}}
\def\chapref#1{\expandafter\@setref\csname r@#1\endcsname
                                   \@thirdofthree{#1}}
\makeatother
\theoremstyle{plain}
\newtheorem{theorem}{Theorem}
\begin{document}
\setcounter{page}{3}
\setcounter{chapter}{1}
\chapter{abc}
\begin{theorem}\label{theo}abc\end{theorem}
Theorem \ref{theo} in chapter \chapref{theo}, page \pageref{theo} says that abc.
\end{document}

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

답변2

필요하지 않은 몇 가지 사항을 주석 처리하고 \@firstofthree및 에 대한 정의를 추가한 후에 코드가 작동하는 것 같습니다 \@secondofthree. ( \@thirdoftree이미 정의되어 있습니다.)

귀하의 코드는하이퍼레프-패키지이므로 다음과 같은 경우에만 작동합니다.하이퍼레프-패키지가 로드되지 않았습니다.

\documentclass{book}
\usepackage{amsthm}
\makeatletter
\renewcommand*\@newl@bel[3]{%
  \@ifundefined{#1@#2}%
  \relax
  {%
    \gdef\@multiplelabels{%
      \@latex@warning@no@line{There were multiply-defined labels}%
    }%
    \@latex@warning@no@line{Label `#2' multiply defined}%
  }%
  \global\@namedef{#1@#2}{#3}%
}%
%\@onlypreamble\@newl@bel
%\let\@multiplelabels\relax
\renewcommand*\label[1]{%
  \@bsphack
  \protected@write\@auxout
                  {}%
                  {\string\newlabel{#1}{{\@currentlabel}{\thepage}{\thechapter}}}%
  \@esphack
}%
%\def\refstepcounter#1{%
%  \stepcounter{#1}%
%  \protected@edef\@currentlabel
%  {\csname p@#1\endcsname\csname the#1\endcsname}%
%}%
\renewcommand*\ref[1]{%
  \expandafter\@setref\csname r@#1\endcsname\@firstofthree{#1}%
}%
\renewcommand*\pageref[1]{%
  \expandafter\@setref\csname r@#1\endcsname\@secondofthree{#1}%
}%
\newcommand*\chapref[1]{%
  \expandafter\@setref\csname r@#1\endcsname\@thirdofthree{#1}%
}
\newcommand\@firstofthree[3]{#1}%
\newcommand\@secondofthree[3]{#2}%
%\newcommand\@thirdofthree[3]{#3}%
\makeatother
\theoremstyle{plain}
\newtheorem{theorem}{Theorem}
\begin{document}
\setcounter{page}{3}
\setcounter{chapter}{1}
\chapter{abc}
\begin{theorem}\label{theo}abc\end{theorem}
Theorem \ref{theo} in chapter \chapref{theo}, page \pageref{theo} says that abc.
\end{document}

정말로 사용하고 싶지 않은 경우zref-패키지 이 문제를 깨지 않을 것 같은 또 다른 조잡한 해킹을 제공할 수 있습니다.하이퍼레프-패키지:

-command가 두 개의 인수 중 하나를 선택하기 위한 강력한 명령이 앞에 오는 두 개의 인수로 확장 되는 방식으로 -macro 를 패치 \label하도록 -command를 재정의/패치합니다. 첫 번째 인수는 패치되기 전에 보유했던 내용을 담고 있습니다. 두 번째 인수 보유 :\label\@currentlabel\@currentlabel\@currentlabel\thechapter

\documentclass{book}
\usepackage{amsthm}
%%\usepackage{hyperref}
\makeatletter
\DeclareRobustCommand\My@GetRefArg[2]{#1}%
\DeclareRobustCommand\MyOther@GetRefArg[2]{#2}%
\newcommand\My@saved@currentlabel{}%
\AtBeginDocument{%
  \let\My@oldlabel=\label
  \renewcommand\label[1]{%
    \@bsphack
    \let\My@saved@currentlabel=\@currentlabel
    \expandafter\def
    \expandafter\@currentlabel
    \expandafter{%
    \expandafter\My@GetRefArg
    \expandafter{%
    \@currentlabel}{\thechapter}}%
    \@esphack
    \My@oldlabel{#1}%
    \@bsphack
    \let\@currentlabel=\My@saved@currentlabel
    \@esphack
  }%
  \@ifpackageloaded{hyperref}{%
    \DeclareRobustCommand\chaprefAtNoStar[1]{%
      \begingroup
      \let\My@GetRefArg\MyOther@GetRefArg
      \ref{#1}%
      \endgroup
    }%
    \DeclareRobustCommand\chaprefAtStar[1]{%
      \begingroup
      \let\My@GetRefArg\MyOther@GetRefArg
      \ref*{#1}%
      \endgroup
    }%
    \DeclareRobustCommand\chapref{%
      \@ifstar\chaprefAtStar\chaprefAtNoStar
    }%
  }{%
    \DeclareRobustCommand\chapref[1]{%
      \begingroup
      \let\My@GetRefArg\MyOther@GetRefArg
      \ref{#1}%
      \endgroup
    }%
  }%
}%
\makeatother
\theoremstyle{plain}
\newtheorem{theorem}{Theorem}
\begin{document}
\setcounter{page}{3}
\setcounter{chapter}{1}
\chapter{abc}
\begin{theorem}\label{theo}abc\end{theorem}
Theorem \ref{theo} in chapter \chapref{theo}, page \pageref{theo} says that abc.
%%
%%Theorem \ref*{theo} in chapter \chapref*{theo}, page \pageref*{theo} says that abc.
\end{document}

사용하는 경우하이퍼레프, 하이퍼링크는 \chapref해당 장의 시작으로 연결되지 않고 해당 장을 배치하기 전에 마지막 앵커로 배치된 앵커로 연결됩니다 \label. 따라서 위의 예에서 하이퍼링크는 \chapref{theo}해당 정리가 발생하는 장의 번호를 표시하지만 해당 정리의 시작 부분으로 이동합니다.

사용하는 경우하이퍼레프, 문제의 숫자를 "별표"로 표시 \ref하고 표시하지만 하이퍼링크를 생성하지 않습니다. \pageref따라서 다음과 같은 경우하이퍼레프로드되는 중 의 "별표 표시된" 변형도 있습니다 \chapref.

!!!이러한 조악한 해킹이 문서 클래스나 패키지의 기능을 손상시킬 수 있는지 여부는 전혀 알 수 없습니다.!!!

!!!그러므로 나는 어떠한 보증도 하지 않습니다. 파손된 부분이 있으면 그 조각을 처리하는 것은 귀하의 몫입니다.!!!

!!!어떤 문서 클래스나 패키지의 기능이 손상될까 봐 zref-package 사용을 적극 권장합니다.!!!

관련 정보