我正在编写主要描述大量 URL 的文本。问题是这些 URL 中的许多可能很长。
幸运的是,95% 以上的读者会使用屏幕 PDF 阅读器,而不是打印件。因此,我需要一个解决方案,让打印读者清楚地知道我的 URL 不完整(不允许他们点击),并让屏幕读者知道他们只需点击即可进入深层页面。
我能想到的最好的简单解决方案是\http{www.example.com/morelevel/andmorelevel/andyetmorelevel/andmore/andmore/andmore}
应该产生类似的东西\href{www.example.com/morelevel/andmorelevel/andyetmorelevel/andmore/andmore/andmore}{\uline{www.example.com/+}}
。如果没有更深层次的链接,则会省略“+”。(会用来xstrings.sty
实现这一点吗?)
更复杂的解决方案会为每个唯一的 URL 加上尾注(即上标递增的数字),并在文档末尾为印刷读者生成一个类似索引的按字母顺序或页面排序的列表(\href{www.example.com/morelevel/andmorelevel/andyetmorelevel/andmore/andmore/andmore}{\uline{www.example.com}$^\arabic{urlcounter}$}
)或类似的东西。
我也可能喜欢或不喜欢 URL 分解和/或显示http://
。
这些不是 bibtex 问题,而是正文问题。我可能也不是唯一一个遇到这种需求的人。
请问其他人是如何解决这个问题的?
答案1
这是基于 LuaLaTeX 的解决方案,可以解决您在“最佳简单解决方案……”段落和“更复杂的解决方案”段落中提出的问题。主要用户宏称为\hx
;它调用一个名为的 Lua 函数,short_href
该函数完成大部分工作。(我故意没有包括\uline
您的请求部分。如果您希望 URL 字符串以主文档字体而不是等宽字体排版,请删除这两个指令并在序言中\ttfamily
添加指令。)\urlstyle{same}
截断的 URL 将如下所示:
包含未截断 URL 列表的尾注页面将如下所示:
每行开头的红色数字是对相应\hx
指令的反向引用。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{xurl} % or 'url', if arbitrary line breaks in URL strings not allowed
\usepackage{enotez}
%% Set suitable package options:
\setenotez{list-name = {List of complete URL strings}, backref = true}
\usepackage{hyperref}
\hypersetup{colorlinks,urlcolor=blue} % select suitable options
\newcounter{mycounter}
\renewcommand{\themycounter}{\romannumeral\value{mycounter}}
\usepackage{luacode} % for 'luacode*' environment and '\luastringN' macro
\begin{luacode*}
local t,u
function short_href ( s )
t = s
if t:find ( "^http[s]?://" ) then -- Remove prefix substring from 't'
u = t:sub ( 1 , t:find ( "/" ) )
t = t:sub ( string.len ( u ) + 2 )
end
u = t:sub ( 1 , t:find ( "/" ) ) -- Retrieve main part of URL
if string.len ( u ) == string.len (t) then
-- No truncation necessary; hence, generate a simple \href directive
tex.sprint ( "\\href{" .. s .. "}{\\ttfamily " .. u .. "}" )
else -- Truncation of displayed URL is necessary
tex.sprint ( "\\stepcounter{mycounter}" )
-- See https://tex.stackexchange.com/a/594361/5001 for further details.
-- A. Generate an \urldef command (for use with \endnote, see next command):
tex.sprint ( "\\expandafter\\urldef\\csname zz\\themycounter\\endcsname\\url{".. s .."}" )
-- B. Generate \href _and_ \endnote commands:
tex.sprint ( "\\href{" .. s .. "}{\\ttfamily " .. u .. "+}" ..
"\\expandafter\\endnote\\expandafter{\\csname zz\\themycounter\\endcsname}" )
end
end
\end{luacode*}
%% LaTeX utility macro:
\newcommand\hx[1]{\directlua{short_href(\luastringN{#1})}}
\begin{document}
\hx{https://tex.stackexchange.com/questions/594302/smart-url-shortening}
\hx{https://www.google.com/}
\hx{https://www.sciencedirect.com/science/article/abs/pii/S0304405X00000763}\
\newpage
\printendnotes
\end{document}