%20%EC%A0%9C%EA%B1%B0%20%EA%B7%9C%EC%B9%99%EC%97%90%20%EB%94%B0%EB%9D%BC%20%EC%88%AB%EC%9E%90%2F%ED%8E%98%EC%9D%B4%EC%A7%80%20%EC%B0%B8%EC%A1%B0%20%EB%B2%94%EC%9C%84%20%ED%98%95%EC%8B%9D%EC%9D%84%20%EC%A7%80%EC%A0%95%ED%95%A9%EB%8B%88%EB%8B%A4..png)
옥스퍼드 스타일 가이드 규칙은 숫자 및 페이지 참조의 범위를 축약하는 것에 대해 다음과 같이 말합니다.
일반적으로 숫자 범위의 경우 가능한 한 적은 수의 숫자를 생략하여 규칙을 사용합니다.30–1, 42–3, 132–6, 1841–5. 그러나 100개마다 10부터 19까지 그룹의 숫자는 생략하지 마십시오. 이는 복합 숫자가 아닌 단일 숫자를 나타내기 때문입니다.10–12, 15–19, 114–18, 214–15, 310–11.
TeX/LuaTeX의 다양한 페이지 또는 다른 동적 숫자 범위에 대해 이것을 어떻게 구현합니까?
답변1
\documentclass{article}
\usepackage{fontspec} % for easy UTF-8 support -- change en-dashes to '--' below to get rid of this dependency
\usepackage{luacode}
\usepackage{xifthen}
\usepackage{refcount}
\usepackage{lipsum} % used only for the test pages in this document
\begin{luacode}
function common_prefix(a, b)
for idx = 1, string.len(a) do
if a:sub(idx, idx) ~= b:sub(idx, idx) then
return a:sub(1, idx - 1)
end
end
end
function numberrange_string(a, b)
as = tostring(a)
bs = tostring(b)
if a == b then
return as
elseif as:len() ~= bs:len() then
return as .. "–" .. bs
else
common_range = common_prefix(as, bs)
if common_range:len() == 0 then
return as .. "–" .. bs
elseif as:sub(as:len() - 1, as:len() - 1) == "1" then
return common_range:sub(1, common_range:len() - 1) .. as:sub(common_range:len(), as:len()) .. "–" .. bs:sub(common_range:len(), bs:len())
else
return common_range:sub(1, common_range:len()) .. as:sub(common_range:len() + 1, as:len()) .. "–" .. bs:sub(common_range:len() + 1, bs:len())
end
end
end
function numberrange(a, b)
tex.print(numberrange_string(a, b))
end
\end{luacode}
\newcommand{\numberrange}[2]{\directlua{numberrange(#1, #2)}}
\newcommand{\pagerefrange}[2]{\ifthenelse{\equal{\getpagerefnumber{#1}}{\getpagerefnumber{#2}}}%
{p.~\pageref{#1}}%
{pp.~\numberrange{\getpagerefnumber{#1}}{\getpagerefnumber{#2}}}}
\begin{document}
Some simple number ranges: \numberrange{1}{2}, \numberrange{21}{24}, \numberrange{97}{156}, \numberrange{109}{112}, \numberrange{112}{115}, \numberrange{151}{158}, \numberrange{1100}{1113}, \numberrange{11564}{11615}, \numberrange{12991}{13001}*.
Some page ranges: Test 1: \pagerefrange{test1-start}{test1-end}; Test 2: \pagerefrange{test2-start}{test2-end}; Test 3: \pagerefrange{test3-start}{test3-end}; Test 4: \pagerefrange{test4-start}{test4-end}; Test 5: \pagerefrange{test5-start}{test5-end}.
\clearpage
Test 1 is all on the same page. \label{test1-start}\label{test1-end}
Test 2 starts on the same page as Test 1, but ends on a different one. \label{test2-start}
Test 5 also starts here. \label{test5-start}
\clearpage
This is the end of Test 2. \label{test2-end}
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage
Test 3 shows how ranges in the teens don’t get elided. \label{test3-start}
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage
Test 3 ends here. \label{test3-end}
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage
Test 4 shows how ranges in the twenties to nineties do get elided. \label{test4-start}
\clearpage \lipsum[1]
\clearpage \lipsum[1]
\clearpage
Test 4 ends here. \label{test4-end}
Test 5 also ends here. It shows how ranges where the ends have different numbers of digits are written in full. \label{test5-end}
\end{document}
테스트 케이스 목록을 받았습니다.피터 카렐의 페이지이것이 모두 통과되었음을 확인했습니다.
NB 나는 Kahrel의 테스트 케이스와 10000 범위의 범위 처리에 관한 규칙 해석에 동의하지 않습니다. 그가 '12991-3001'을 가지고 있는 경우, 누군가는 '12,000'이라고 말할 것이기 때문에 나는 12991-13001을 가질 것입니다. 구백구십일부터 만만 삼천일까지'가 아니라 '... 삼천일까지'가 아닙니다. 개인적으로 이렇게 큰 범위를 처리할 필요가 없기 때문에 위의 코드에서는 이를 처리하지 않습니다.