
이 질문으로 인해 새로운 패키지가 탄생했습니다.
chkfloat
내(2열) 문서를 약간 수정하면 부동 소수점(단일 열과 이중 열 모두)이 여기저기로 이동할 수 있습니다. 나는 내 문서가 F
페이지에 있을 P
때보다 float가 페이지에 있을 때 더 좋아 보일 가능성이 높다는 것을 알고 있습니다 P+1
. 그러나 문서가 길고 플로트가 이동했는지 확인하기 위해 각 빌드 후 모든 페이지를 확인하는 것이 번거롭습니다.
따라서 내 부동 소수점의 일부 하위 집합에 대해 지정된 F(n)
페이지에 float가 없으면 P(n)
LaTeX 에서 오류를 발생시키거나 적어도 어떤 방식으로든 경고하도록 하고 싶습니다 (추적을 처리할 수 있는 답변에 만족하겠습니다 ). 그래도 시작하려면 하나의 플로트!). 그러나 부동소수점 내부에 검사 코드를 넣는 것은 불가능합니다. 왜냐하면 이 코드는 부동소수점이 "배치"될 때가 아니라 "읽혀질" 때 실행되기 때문입니다.F(n)
P(n)
내가 선호하는 위치에 플로트가 나타나도록 플로트 매개변수를 조정할 수 있다고 해도 이는 여전히 유용한 자동화 테스트가 될 것이므로 강제로 실행되는 일부 마법 매개변수가 없는 한 내 질문의 초점은 플로트 매개변수에 관한 것이 아닙니다. LaTeX는 내가 지정한 대략적인 위치(즉, 부동 장소! ---어쨌든 두 개의 열 부동 소수점에서는 불가능하다고 가정하는 '여기'뿐만 아니라)에 부동 소수점을 배치합니다.
\listoffigures
LaTeX는 이 정보를 표시할 수 있으므로 어떤 페이지에 어떤 부동 소수점이 나타나는지 추적합니다 . 하지만 테스트를 수행하기 위해 해당 정보에 직접 액세스하는 가장 좋은 방법이 무엇인지 잘 모르겠습니다. 플로트가 배치될 때 호출되는 후크가 있습니까? 테스트는 한 번에 실행되는 것이 바람직하지만(그림 목록을 업데이트하려면 두 번 실행해야 함) 이것이 필수는 아닙니다.
나는 단일 플로트가 있는 단일 열 MWE를 포함시켰습니다. 범위 를 변경하면 \lipsum
플로트가 배치되는 위치가 변경됩니다. (이중 컬럼 특성으로 인해 큰 차이가 발생하는 경우 수정된 MWE를 공급해 볼 수 있습니다.)
\documentclass{article}
\usepackage[a4paper]{geometry}%don't trust MikTeX's defaults!
\usepackage{lipsum}
\begin{document}
% choose which of the following two lines to use to configure where the float appears.
\lipsum[1-5]% figure appears on page 2 if this line is used
%\lipsum[1-4]% figure appears on page 1 if this line is used
\begin{figure}
\centering
Hello world. I was typeset on page \thepage, but that may not be where I appear!
\rule{4cm}{4cm}
\caption{fig}
\end{figure}
***Figure appeared in the text just above here.***
\lipsum[5-8]
\listoffigures
\end{document}
답변1
JLDIAz와는 다른 접근 방식. 서문 사이 START HERE
와 끝 부분에 코드를 넣으세요 . END HERE
코드는 자체 주석 처리되어 있습니다.
주목:이걸 패키지로 만들었어요. 이 코드를 직접 사용하지 마세요.패키지를 받아 사용하세요.
\documentclass{article}
% START HERE
\makeatletter
% tolerances
\PassOptionsToPackage{patch}{kvoptions}
\RequirePackage{kvoptions}
\DeclareStringOption{tolerance}
\def\chkfloat@tolerance{1}
\ProcessKeyvalOptions*
% store original macros \@float and \@caption
\let\chkfloat@float\@float
\let\chkfloat@caption\@caption
% make \@float remember the page where the float should be
\def\@float{\edef\chkfloat@page{\thepage}\chkfloat@float}
% make \@caption write to a file .fof the information about final page, original page and float caption
\def\@caption#1[#2]#3{\chkfloat@caption{#1}[#2]{#3}%
\addtocontents{fof}{\protect\chkfloat@{\thepage}{\chkfloat@page}{\csname fnum@#1\endcsname: #2}}%
}
% checking macro
\def\chkfloat@#1#2#3{\ifnum#1>\numexpr#2+\chkfloat@tolerance\relax
\begingroup\let\on@line\@gobble\def\nobreakspace{ }\GenericWarning{}{Float misplaced on pages #2->#1, #3}\endgroup
\fi
}
% process the file .fof
\@starttoc{fof}
\makeatother
% END HERE
\begin{document}
Hello world!
\begin{figure}[b]
FIGURE BOTTOM
\caption{Figure at bottom}
\end{figure}
\begin{figure}[p]
FIGURE PAGE
\caption{Figure at its page}
\end{figure}
\end{document}
답변2
여기에 아이디어가 있습니다. \label
캡션 옆에 명령을 사용하면 LaTeX는 .aux
그림 번호와 페이지 번호(그림이 나타나는 실제 페이지 번호)를 파일에 기록합니다. 또한 명령으로 검색할 수 있는 페이지 번호를 저장하는 매크로를 정의합니다 \pageref
.
아이디어는 \label
그림이 표시되어야 하는 페이지를 지정하는 a를 각 그림에 추가하는 것입니다 \label{ShouldBeOnPage1}
. 예를 들면 다음과 같습니다. 외부 스크립트는 -aux
파일을 읽고 레이블 이름을 페이지 번호 값과 비교할 수 있습니다.
더 좋은 점은 LaTeX는 문서 끝부분에서 이 검사를 수행할 수 있다는 것입니다. 다음 MWE는 기본 아이디어를 제공하지만 단일 수치만 확인합니다. 적절한 솔루션에는 모든 수치를 확인하는 루프가 포함되지만 완전한 솔루션을 구현하기 위한 지식이 부족합니다. 첫 번째 그림에서 했던 것처럼 각 검사를 수동으로 지정할 수 있습니다.
\documentclass{article}
\usepackage[a4paper]{geometry}%don't trust MikTeX's defaults!
\usepackage{lipsum}
\def\CheckFloat#1{% The macro which does the check for a single figure
% The parameter is the page number at which the figure should appear
\expandafter\ifx#1\pageref{ShouldBeOnPage#1}%
\relax
\else\GenericWarning{(Floats)}{Warning: A float which should appear on page #1 is misplaced (to page \pageref{ShouldBeOnPage#1})}
\fi
}
\AtEndDocument{% Manually do all checks
\CheckFloat{1}
}
\begin{document}
% choose which of the following two lines to use to configure where the float appears.
\lipsum[1-5]% figure appears on page 2 if this line is used
%\lipsum[1-4]% figure appears on page 1 if this line is used
\begin{figure}
\centering
Hello world. I was typeset on page \thepage, but that may not be where I appear!
\rule{4cm}{4cm}
\caption{fig}\label{ShouldBeOnPage1} % <----- Add this to the figures
\end{figure}
***Figure appeared in the text just above here.***
\lipsum[5-8]
\listoffigures
\end{document}
이 예제를 실행하면 다음과 같은 경고가 표시됩니다.
Warning: A float which should appear on page 1 is misplaced (to page 2\hbox {})
on input line 33.
내 코드는 페이지당 단일 그림을 가정합니다. 적절한 해결책은 그림이 나타나야 하는 페이지를 저장하는 그림 번호를 기반으로 각 그림에 대한 매크로를 정의하고, 그림 번호와 예상 페이지를 기반으로 레이블을 생성하여 실제 페이지를 제공하는 것입니다. \pageref
.
나는 이것이 완전한 해결책이 아니라는 것을 알고 있지만 이 아이디어가 가치가 있고 나보다 더 숙련된 누군가가 그것을 완성하기를 바랍니다.