複数行になった\urlのハイパーリンク上手く飛べない問題

## 複数行になった\urlのハイパーリンクが上手く飛べない
platexで文書を組版していて、[`url`コマンド](https://qiita.com/hirooooooaki/items/84d45c83c6bcb1d52b79)から生成したURL文字列からのハイパーリンクがうまく行かない場合がありました。例えば以下のような場合です。
```tex
\documentclass{jsarticle}

\usepackage{url}

\begin{document}

\url{http://www.samplesamplesamplesample.com/sampletext/sampledownload/sample/sample/samplesamplesample.html}
\end{document}
```
上記のように、長くて改行がなされたURL文字列[^1]は、クリックしても一列目部分しか使用されません。

[^1]: 実際には二段組文書作成中に経験しました。サンプルを簡略化するために誇張した長いURLを用いており、通常なら複数行になりにくいと思います。

## 解決法(platex版)
以下のような感じで[hyperrefパッケージ](https://ctan.org/pkg/hyperref)を使用しましょう[^2]。`dvipdfmx`を使用してpdf変換を行う場合は、オプション指定が必要です[^3]。
```tex
\documentclass{jsarticle}

\usepackage[
  hidelinks, % リンクに枠をつけない
  dvipdfmx   % dvipdfmx使用ならオプション指定必須
  ]{hyperref}

\begin{document}

\url{http://www.samplesamplesamplesample.com/sampletext/sampledownload/sample/sample/samplesamplesample.html}
\end{document}
```

[^2]: そもそもurlパッケージに「[This package does not make hyper-links!](https://ctan.org/pkg/url)」と記載されているので、ハイパーリンクについては考慮されていない気がする...

[^3]: ドライバー指定がない場合、pdfTEX等のTeXプロセッサ自動検出→`driverfallback`オプションの設定値→`\Hy@defaultdriver`マクロの設定値の順に検索が行われます。hyperrefパッケージのデフォルトは`hypertex`が設定され、dvi modeの場合`dvips`を設定するようです（[hyperref マニュアル](https://ctan.org/pkg/hyperref)）。platexだとdviファイルを出力するので`dvips`がデフォルトで設定されそうなので、正常動作には`dvipdfmx`オプションの指定が必須となります。海外の質問サイトだと、pdflatex等使うことでドライバー指定なしで動作するので中々気づけなかった...

ハイフンがある位置で改行を許可する場合は、[`url`パッケージ](https://ctan.org/pkg/url)を`hyphens`オプションを指定して[**先に**読み込みます](https://stackoverflow.com/questions/2625714/linebreak-in-url-with-bibtex-and-hyperref-package)[^4]。
```tex
\documentclass{jsarticle}
\usepackage[hyphens]{url} % 先にurlパッケージ読込
\usepackage[hidelinks,dvipdfmx]{hyperref}

\begin{document}
% ハイフン後で改行する
\url{http://www.samplesamplesamplesample.com/sampletext/sampledownload/sample/sample-samplesamplesample.html}

% スラッシュ後で改行する
\url{http://www.samplesamplesamplesample.com/sampletext/sampledownload/sample/sample/samplesamplesample.html}
\end{document}
```

[^4]: ネットでは、URLのハイフン後改行を許可するために、`\usepackage[hyphenbreaks]{breakurl}`をhyperrefの後ろに設定する方法も散見されます。しかし、breakurlパッケージは`dvips`ドライバーのみサポートすると[Introductionに明記されている](https://ctan.org/pkg/breakurl)ので、urlパッケージを用いるしかないと思われます。

改行を記号後位置以外でも許可したい場合は、[`xurl`パッケージ](https://ctan.org/pkg/xurl)を指定して**先に**読み込みます。
```tex
\documentclass{jsarticle}
\usepackage[hyphens]{xurl} % ハイフン後改行優先
\usepackage[hidelinks,dvipdfmx]{hyperref}

\begin{document}
% ハイフン後で改行する
\url{http://www.samplesamplesamplesample.com/sampletext/sampledownload/sample/sample-samplesamplesample.html}

% ちょうどいい位置で改行する
\url{http://www.samplesamplesamplesample.com/sampletext/sampledownload/sample/sample/samplesamplesample.html}
\end{document}
```


## 解決法(uplatex版)
`documentclass`を合わせれば使用できます。
```tex
\documentclass[uplatex]{jsarticle}
% \documentclass{ujarticle} % jarticleのuplatex版

\usepackage[hyphens]{url} % 先にurl, xurlパッケージ読込
% \usepackage[hyphens]{xurl}
\usepackage[hidelinks,dvipdfmx]{hyperref}

\begin{document}
% ハイフン後で改行する
\url{http://www.samplesamplesamplesample.com/sampletext/sampledownload/sample/sample-samplesamplesample.html}

% スラッシュ後で改行する
\url{http://www.samplesamplesamplesample.com/sampletext/sampledownload/sample/sample/samplesamplesample.html}
\end{document}
```

## まとめ
ハイパーリンクを正しく飛んで、皆さんも楽しいLaTeX生活を！

## 参考文献

- [stackoveflow: URL latex linebreak](https://stackoverflow.com/questions/2640111/url-latex-linebreak)
- [LaTeX.org: Line breaks in URLs](https://latex.org/forum/viewtopic.php?f=44&t=4022)
- [数学の景色: 【LaTeX】hyperrefパッケージによるハイパーリンク](https://mathlandscape.com/latex-hyperref/)
- [TeX Wiki: hyperref](https://texwiki.texjp.org/?hyperref)