Skip to content

Instantly share code, notes, and snippets.

@kauplan
Last active September 5, 2020 04:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kauplan/f3729580bf6f083438f183873c93702a to your computer and use it in GitHub Desktop.
Save kauplan/f3729580bf6f083438f183873c93702a to your computer and use it in GitHub Desktop.
[reviewstarter] 長いURLを自動的に改行したい

要件

Re:VIEW Starterにおいて、長いURLを途中で自動的に改行したい。
詳しくはこちら
https://twitter.com/circleblowing/status/1297946704881184769

アイデア

\seqsplit{...} を使うと単語の途中でも自動的に改行してくれる。
これを利用して、\url{...}\href{...}{\texttt{\seqsplit{...}}} に置き換える。

ただし \url{} マクロを上書きするのは影響範囲が大きいので、かわりに myurl{} というマクロを定義する。

方法

sty/mystyle.sty に以下を追加。

%% 長いURLを自動的に改行する
\newcommand{\myurl}[2]{%
  \href{#1}{\texttt{\seqsplit{#2}}}%
}

review-ext.rb に以下を追加。

module ReVIEW

  class LATEXBuilder

    ## ===== ここから =====

    def _inline_hyperlink(url, escaped_label, flag_footnote)
      if /\A[a-z]+:/ !~ url
        "\\ref{#{url}}"
      elsif ! escaped_label.present?
        #"\\url{#{escape_url(url)}}"
        "\\myurl{#{escape_url(url)}}{#{escape(url)}}"
      elsif ! flag_footnote
        "\\href{#{escape_url(url)}}{#{escaped_label}}"
      elsif within_context?(:footnote)
        #"#{escaped_label}(\\url{#{escape_url(url)}})"
        "#{escaped_label}(\\myurl{#{escape_url(url)}}{#{escape(url)}})"
      else
        #"#{escaped_label}\\footnote{\\url{#{escape_url(url)}}}"
        "#{escaped_label}\\footnote{\\myurl{#{escape_url(url)}}{#{escape(url)}}}"
      end
    end
    private :_inline_hyperlink

    ## ===== ここまで =====

  end

end

失敗した方法

以下の方法では、URLに _. が含まれるとLaTeXのコンパイルエラーになる。
理由は、URL と LaTeX ではエスケープする文字が違うから。
(例:_ は、LaTeX 中ではエスケープする必要があるが、URL 中ではエスケープしてはならない。)

sty/mystyle.sty に以下を追加。

%% 長いURLを自動的に改行する
\newcommand{\myurl}[1]{%
  %\url{#1}%
  \href{#1}{\texttt{\seqsplit{#1}}}%
}

review-ext.rb に以下を追加。

module ReVIEW

  class LATEXBuilder

    ## ===== ここから =====

    alias __inline_hyperlink _inline_hyperlink

    def _inline_hyperlink(*args)
      s = __inline_hyperlink(*args)
      return s.gsub(/\\url\{/, '\\myurl{')  # マクロ名をすり替える(`\url{}` → `\myurl{}`)
    end

    ## ===== ここまで =====

  end

end

補足

Re:VIEW Staretr本体に取り込むかは未定。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment