diff --git a/_extensions/drwater b/_extensions/drwater deleted file mode 160000 index 5affc0d..0000000 --- a/_extensions/drwater +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5affc0d0a1abde4446cd6e356927b02d5d42518f diff --git a/_extensions/drwater/authoraffil/_extension.yaml b/_extensions/drwater/authoraffil/_extension.yaml new file mode 100644 index 0000000..e2823ac --- /dev/null +++ b/_extensions/drwater/authoraffil/_extension.yaml @@ -0,0 +1,16 @@ +title: Authors and affiliation formatting for quarto +authors: + - name: Ming Su + email: mingsu@rcees.ac.cn + orcid: 0000-0001-9821-1268 + url: https://drwater.net/team/ming-su/ + - name: Lorenz A. Kapsner + orcid: 0000-0003-1866-860X + - name: Albert Krewinkel + orcid: 0000-0002-9455-0796 + - name: Robert Winkler +version: 0.3.2 +quarto-required: ">=1.3.0" +contributes: + filters: + - authoraffil.lua diff --git a/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/_extension.yaml b/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/_extension.yaml new file mode 100644 index 0000000..e2823ac --- /dev/null +++ b/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/_extension.yaml @@ -0,0 +1,16 @@ +title: Authors and affiliation formatting for quarto +authors: + - name: Ming Su + email: mingsu@rcees.ac.cn + orcid: 0000-0001-9821-1268 + url: https://drwater.net/team/ming-su/ + - name: Lorenz A. Kapsner + orcid: 0000-0003-1866-860X + - name: Albert Krewinkel + orcid: 0000-0002-9455-0796 + - name: Robert Winkler +version: 0.3.2 +quarto-required: ">=1.3.0" +contributes: + filters: + - authoraffil.lua diff --git a/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/authoraffil.lua b/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/authoraffil.lua new file mode 100644 index 0000000..43b2580 --- /dev/null +++ b/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/authoraffil.lua @@ -0,0 +1,75 @@ +--[[ +authors-block – affiliations block extension for quarto +Copyright (c) 2023 Lorenz A. Kapsner +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. +]] + +local List = require("pandoc.List") +local from_utils = require("utils") +local normalize_affiliations = from_utils.normalize_affiliations +local normalize_authors = from_utils.normalize_authors +local from_authors = require("from_author_info_blocks") +local default_marks = from_authors.default_marks +local create_equal_contributors_block = from_authors.create_equal_contributors_block +local create_affiliations_blocks = from_authors.create_affiliations_blocks +local create_correspondence_blocks = from_authors.create_correspondence_blocks +local is_corresponding_author = from_authors.is_corresponding_author +local author_inline_generator = from_authors.author_inline_generator +local create_authors_inlines = from_authors.create_authors_inlines + +function Pandoc(doc) + local meta = doc.meta + local body = List:new({}) + local mark = function(mark_name) + return default_marks[mark_name] + end + + -- Process CRediT roles + if meta.authors then + local credit_roles = List:new({}) + for i, author in ipairs(meta.authors) do + if author.role then + local roles = List:new({}) + for role, level in pairs(author.role) do + roles:insert(pandoc.Str(role .. ": " .. stringify(level))) + end + if #roles > 0 then + local author_name = stringify(author.name) + credit_roles:insert(pandoc.Para({ + pandoc.Str(author_name .. ": "), + pandoc.Str(table.concat(roles:map(stringify), ", ")), + })) + end + end + end + if #credit_roles > 0 then + body:insert(pandoc.Header(2, pandoc.Str("Author Contributions"))) + body:extend(credit_roles) + end + end + + body:extend(create_equal_contributors_block(meta.authors, mark) or {}) + body:extend(create_affiliations_blocks(meta.affiliations, meta) or {}) + body:extend(create_correspondence_blocks(meta.authors, mark) or {}) + body:extend(doc.blocks) + + for _i, author in ipairs(meta.authors) do + author.test = is_corresponding_author(author) + end + + meta.affiliations = normalize_affiliations(meta.affiliations or {}) + meta.author = meta.authors:map(normalize_authors(meta.affiliations)) + meta.author = pandoc.MetaInlines(create_authors_inlines(meta.author, mark, meta)) + meta.affiliations = nil + + return pandoc.Pandoc(body, meta) +end diff --git a/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/from_author_info_blocks.lua b/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/from_author_info_blocks.lua new file mode 100644 index 0000000..e1216f1 --- /dev/null +++ b/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/from_author_info_blocks.lua @@ -0,0 +1,297 @@ +--[[ +affiliation-blocks – generate title components +Copyright © 2017–2021 Albert Krewinkel +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. +]] + +local from_utils = require("utils") +local has_key = from_utils.has_key +local List = require("pandoc.List") +local utils = require("pandoc.utils") +local stringify = utils.stringify + +local M = {} + +local default_marks = { + corresponding_author = FORMAT == "latex" and { pandoc.RawInline("latex", "*") } or { pandoc.Str("*") }, + equal_contributor = FORMAT == "latex" and { pandoc.RawInline("latex", "\\#") } or { pandoc.Str("#") }, +} + +local function get_orcid_mark(orcid_value) + if not orcid_value then + return {} + end + local orcid_str + if type(orcid_value) == "string" then + orcid_str = orcid_value + elseif type(orcid_value) == "table" then + if orcid_value.text then + orcid_str = orcid_value.text + elseif orcid_value[1] and orcid_value[1].text then + orcid_str = orcid_value[1].text + else + return {} + end + else + return {} + end + orcid_str = orcid_str:gsub("[%-%s]", "") + if FORMAT == "latex" then + return { pandoc.RawInline("latex", "\\orcidlink{" .. orcid_str .. "}") } + elseif FORMAT:match("docx") then + local orcid_url = "https://orcid.org/" .. orcid_str + return { + pandoc.Str(" "), + pandoc.Link("ID", orcid_url), + } + else + local orcid_url = "https://orcid.org/" .. orcid_str + return { pandoc.Link(pandoc.Str(""), orcid_url, "", { class = "orcid" }) } + end +end + +M.default_marks = default_marks + +local function is_equal_contributor(author) + if has_key(author, "attributes") then + return author.attributes["equal-contributor"] + end + return nil +end + +local function create_equal_contributors_block(authors, mark) + local has_equal_contribs = List:new(authors):find_if(is_equal_contributor) + if not has_equal_contribs then + return nil + end + local contributors = { + pandoc.Superscript(mark("equal_contributor")), + pandoc.Space(), + pandoc.Str("These authors contributed equally to this work."), + } + return List:new({ pandoc.Para(contributors) }) +end +M.create_equal_contributors_block = create_equal_contributors_block + +local function intercalate(lists, elem) + local result = List:new({}) + for i = 1, (#lists - 1) do + result:extend(lists[i]) + result:extend(elem) + end + if #lists > 0 then + result:extend(lists[#lists]) + end + return result +end + +local function is_corresponding_author(author) + if has_key(author, "attributes") then + if author.attributes["corresponding"] then + return author.email + end + end + return nil +end +M.is_corresponding_author = is_corresponding_author + +local function create_correspondence_blocks(authors, mark) + local corresponding_authors = List:new({}) + for _, author in ipairs(authors) do + if is_corresponding_author(author) then + local mailto = "mailto:" .. stringify(author.email) + local author_with_mail = List:new( + author.name.literal + .. List:new({ pandoc.Space(), pandoc.Str("(") }) + .. author.email + .. List:new({ pandoc.Str(")") }) + ) + local link = pandoc.Link(author_with_mail, mailto) + table.insert(corresponding_authors, { link }) + end + end + if #corresponding_authors == 0 then + return nil + end + local correspondence = List:new({ + pandoc.Superscript(mark("corresponding_author")), + pandoc.Space(), + pandoc.Str("Corresponding to:"), + pandoc.Space(), + }) + local sep = List:new({ pandoc.Str(","), pandoc.Space() }) + return { pandoc.Para(correspondence .. intercalate(corresponding_authors, sep)) } +end + +M.create_correspondence_blocks = create_correspondence_blocks + +local function author_inline_generator(get_mark, meta) + return function(author) + local author_marks = List:new({}) + if has_key(author, "orcid") then + author_marks[#author_marks + 1] = get_orcid_mark(author.orcid) + end + local affilstyle = meta and meta.affilstyle and stringify(meta.affilstyle) or "alphabeta" + for _, idx in ipairs(author.affiliations) do + local idx_num = tonumber(stringify(idx)) -- Convert MetaString/MetaInlines to number + if not idx_num then + error("Invalid affiliation index: " .. tostring(idx)) + end + local idx_str + if affilstyle == "number" then + idx_str = tostring(idx_num) + else + if idx_num > 26 then + error("Too many affiliations: only up to 26 (a-z) are supported") + end + idx_str = string.char(96 + idx_num) + end + author_marks[#author_marks + 1] = { pandoc.Str(idx_str) } + end + if has_key(author, "attributes") then + if author.attributes["equal-contributor"] then + author_marks[#author_marks + 1] = get_mark("equal_contributor") + end + end + if is_corresponding_author(author) then + author_marks[#author_marks + 1] = get_mark("corresponding_author") + end + if FORMAT:match("latex") then + author.name.literal[#author.name.literal + 1] = pandoc.Superscript(intercalate(author_marks, { pandoc.Str(",") })) + return author + else + local res = List.clone(author.name.literal) + res[#res + 1] = pandoc.Superscript(intercalate(author_marks, { pandoc.Str(",") })) + return res + end + end +end +M.author_inline_generator = author_inline_generator + +local function create_authors_inlines(authors, mark, meta) + local inlines_generator = author_inline_generator(mark, meta) + local inlines = List:new(authors):map(inlines_generator) + local and_str = List:new({ pandoc.Space(), pandoc.Str("and"), pandoc.Space() }) + local last_author = inlines[#inlines] + inlines[#inlines] = nil + local result = intercalate(inlines, { pandoc.Str(","), pandoc.Space() }) + if #authors > 1 then + if #authors == 2 then + result:extend(and_str) + else + result:extend(List:new({ pandoc.Str(",") }) .. and_str) + end + end + result:extend(last_author) + return result +end +M.create_authors_inlines = create_authors_inlines + +local function create_affiliations_blocks_alphabeta(affiliations, meta) + local affilstyle = meta and meta.affilstyle and stringify(meta.affilstyle) or "alphabeta" + local affil_lines = List:new(affiliations):map(function(affil, i) + if affilstyle == "number" then + num_inlines = pandoc.List:new({ + pandoc.Superscript(pandoc.Str(tostring(i))), + pandoc.Space(), + }) + else + num_inlines = pandoc.List:new({ + pandoc.Superscript(pandoc.Str(string.char(96 + i))), + pandoc.Space(), + }) + end + local name_inlines = type(affil.name) == "table" and affil.name or { pandoc.Str(tostring(affil.name)) } + local city_inlines = type(affil.city) == "table" and affil.city or { pandoc.Str(tostring(affil.city)) } + local postcode_inlines = type(affil["postal-code"]) == "table" and affil["postal-code"] + or { pandoc.Str(tostring(affil["postal-code"])) } + local country_inlines = type(affil.country) == "table" and affil.country + or { pandoc.Str(tostring(affil.country or affil["postal-code"])) } + return num_inlines + :extend(name_inlines) + :extend({ pandoc.Str(", ") }) + :extend(city_inlines) + :extend({ pandoc.Space() }) + :extend(postcode_inlines) + :extend({ pandoc.Str(", ") }) + :extend(country_inlines) + :extend({ pandoc.Str(".") }) + end) + local combined_inlines = pandoc.List:new() + for i, line in ipairs(affil_lines) do + combined_inlines:extend(line) + if i < #affil_lines then + combined_inlines:extend({ pandoc.LineBreak() }) + end + end + return { pandoc.Para(combined_inlines) } +end + +local function create_affiliations_blocks_number(affiliations, meta) + local affilstyle = meta and meta.affilstyle and stringify(meta.affilstyle) or "alphabeta" + local affil_lines = List:new(affiliations):map(function(affil, i) + local num_inlines = pandoc.List:new({ + pandoc.Superscript(pandoc.Str(tostring(i))), + pandoc.Space(), + }) + local name_inlines = type(affil.name) == "table" and affil.name or { pandoc.Str(tostring(affil.name)) } + local city_inlines = type(affil.city) == "table" and affil.city or { pandoc.Str(tostring(affil.city)) } + local postcode_inlines = type(affil["postal-code"]) == "table" and affil["postal-code"] + or { pandoc.Str(tostring(affil["postal-code"])) } + local country_inlines = type(affil.country) == "table" and affil.country + or { pandoc.Str(tostring(affil.country or affil["postal-code"])) } + return num_inlines + :extend(name_inlines) + :extend({ pandoc.Str(", ") }) + :extend(city_inlines) + :extend({ pandoc.Space() }) + :extend(postcode_inlines) + :extend({ pandoc.Str(", ") }) + :extend(country_inlines) + :extend({ pandoc.Str(".") }) + end) + local combined_inlines = pandoc.List:new() + for i, line in ipairs(affil_lines) do + combined_inlines:extend(line) + if i < #affil_lines then + combined_inlines:extend({ pandoc.LineBreak() }) + end + end + return { pandoc.Para(combined_inlines) } +end + +M.create_affiliations_blocks = create_affiliations_blocks_alphabeta + +function Meta(meta) + local affilstyle = meta and meta.affilstyle and stringify(meta.affilstyle) or "alphabeta" + M.create_affiliations_blocks = affilstyle == "number" and create_affiliations_blocks_number + or create_affiliations_blocks_alphabeta + if meta.authors then + meta.author = create_authors_inlines(meta.authors, M.default_marks, meta) + end + if meta.affiliations then + meta.institute = M.create_affiliations_blocks(meta.affiliations, meta) + end + if meta.authors then + local equal_contributors = create_equal_contributors_block(meta.authors, M.default_marks) + if equal_contributors then + meta["equal-contributors"] = equal_contributors + end + local correspondence = create_correspondence_blocks(meta.authors, M.default_marks) + if correspondence then + meta.correspondence = correspondence + end + end + return meta +end + +return M diff --git a/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/from_scholarly_metadata.lua b/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/from_scholarly_metadata.lua new file mode 100644 index 0000000..a9dcf5b --- /dev/null +++ b/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/from_scholarly_metadata.lua @@ -0,0 +1,51 @@ +--[[ +ScholarlyMeta – normalize author/affiliation meta variables +Copyright (c) 2017-2021 Albert Krewinkel, Robert Winkler +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. +]] + +local List = require("pandoc.List") +local utils = require("pandoc.utils") +local stringify = utils.stringify + +local M = {} + +local function has_id(id) + return function(x) + return x.id == id + end +end + +local function resolve_institutes(institute, known_institutes) + local unresolved_institutes + if institute == nil then + unresolved_institutes = {} + elseif type(institute) == "string" or type(institute) == "number" then + unresolved_institutes = { institute } + else + unresolved_institutes = institute + end + local result = List:new({}) + for i, inst in ipairs(unresolved_institutes) do + local intermed_val = known_institutes:find_if(has_id(stringify(inst))) + if intermed_val then + result[i] = pandoc.MetaString(tostring(intermed_val.index)) + else + result[i] = pandoc.MetaString(tostring(inst)) + end + end + return result +end +M.resolve_institutes = resolve_institutes + +return M + diff --git a/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/utils.lua b/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/utils.lua new file mode 100644 index 0000000..2f5df89 --- /dev/null +++ b/_extensions/drwater/authoraffil/_extensions/drwater/authoraffil/utils.lua @@ -0,0 +1,49 @@ +--[[ +authors-block – affiliations block extension for quarto +Copyright (c) 2023 Lorenz A. Kapsner +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. +]] + +local List = require("pandoc.List") +local utils = require("pandoc.utils") +local stringify = utils.stringify +local from_scholarly = require("from_scholarly_metadata") +local resolve_institutes = from_scholarly.resolve_institutes + +local M = {} + +local function normalize_affiliations(affiliations) + local affiliations_norm = List:new(affiliations or {}):map(function(affil, i) + affil.index = pandoc.MetaString(tostring(i)) + affil.id = pandoc.MetaString(stringify(affil.id or affil.name)) + return affil + end) + return affiliations_norm +end +M.normalize_affiliations = normalize_affiliations + +local function has_key(set, key) + return set[key] ~= nil +end +M.has_key = has_key + +local function normalize_authors(affiliations) + return function(auth) + auth.id = pandoc.MetaString(stringify(auth.name)) + auth.affiliations = resolve_institutes(auth.affiliations or {}, affiliations) + return auth + end +end +M.normalize_authors = normalize_authors + +return M + diff --git a/_extensions/drwater/authoraffil/authoraffil.lua b/_extensions/drwater/authoraffil/authoraffil.lua new file mode 100644 index 0000000..43b2580 --- /dev/null +++ b/_extensions/drwater/authoraffil/authoraffil.lua @@ -0,0 +1,75 @@ +--[[ +authors-block – affiliations block extension for quarto +Copyright (c) 2023 Lorenz A. Kapsner +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. +]] + +local List = require("pandoc.List") +local from_utils = require("utils") +local normalize_affiliations = from_utils.normalize_affiliations +local normalize_authors = from_utils.normalize_authors +local from_authors = require("from_author_info_blocks") +local default_marks = from_authors.default_marks +local create_equal_contributors_block = from_authors.create_equal_contributors_block +local create_affiliations_blocks = from_authors.create_affiliations_blocks +local create_correspondence_blocks = from_authors.create_correspondence_blocks +local is_corresponding_author = from_authors.is_corresponding_author +local author_inline_generator = from_authors.author_inline_generator +local create_authors_inlines = from_authors.create_authors_inlines + +function Pandoc(doc) + local meta = doc.meta + local body = List:new({}) + local mark = function(mark_name) + return default_marks[mark_name] + end + + -- Process CRediT roles + if meta.authors then + local credit_roles = List:new({}) + for i, author in ipairs(meta.authors) do + if author.role then + local roles = List:new({}) + for role, level in pairs(author.role) do + roles:insert(pandoc.Str(role .. ": " .. stringify(level))) + end + if #roles > 0 then + local author_name = stringify(author.name) + credit_roles:insert(pandoc.Para({ + pandoc.Str(author_name .. ": "), + pandoc.Str(table.concat(roles:map(stringify), ", ")), + })) + end + end + end + if #credit_roles > 0 then + body:insert(pandoc.Header(2, pandoc.Str("Author Contributions"))) + body:extend(credit_roles) + end + end + + body:extend(create_equal_contributors_block(meta.authors, mark) or {}) + body:extend(create_affiliations_blocks(meta.affiliations, meta) or {}) + body:extend(create_correspondence_blocks(meta.authors, mark) or {}) + body:extend(doc.blocks) + + for _i, author in ipairs(meta.authors) do + author.test = is_corresponding_author(author) + end + + meta.affiliations = normalize_affiliations(meta.affiliations or {}) + meta.author = meta.authors:map(normalize_authors(meta.affiliations)) + meta.author = pandoc.MetaInlines(create_authors_inlines(meta.author, mark, meta)) + meta.affiliations = nil + + return pandoc.Pandoc(body, meta) +end diff --git a/_extensions/drwater/authoraffil/from_author_info_blocks.lua b/_extensions/drwater/authoraffil/from_author_info_blocks.lua new file mode 100644 index 0000000..e1216f1 --- /dev/null +++ b/_extensions/drwater/authoraffil/from_author_info_blocks.lua @@ -0,0 +1,297 @@ +--[[ +affiliation-blocks – generate title components +Copyright © 2017–2021 Albert Krewinkel +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. +]] + +local from_utils = require("utils") +local has_key = from_utils.has_key +local List = require("pandoc.List") +local utils = require("pandoc.utils") +local stringify = utils.stringify + +local M = {} + +local default_marks = { + corresponding_author = FORMAT == "latex" and { pandoc.RawInline("latex", "*") } or { pandoc.Str("*") }, + equal_contributor = FORMAT == "latex" and { pandoc.RawInline("latex", "\\#") } or { pandoc.Str("#") }, +} + +local function get_orcid_mark(orcid_value) + if not orcid_value then + return {} + end + local orcid_str + if type(orcid_value) == "string" then + orcid_str = orcid_value + elseif type(orcid_value) == "table" then + if orcid_value.text then + orcid_str = orcid_value.text + elseif orcid_value[1] and orcid_value[1].text then + orcid_str = orcid_value[1].text + else + return {} + end + else + return {} + end + orcid_str = orcid_str:gsub("[%-%s]", "") + if FORMAT == "latex" then + return { pandoc.RawInline("latex", "\\orcidlink{" .. orcid_str .. "}") } + elseif FORMAT:match("docx") then + local orcid_url = "https://orcid.org/" .. orcid_str + return { + pandoc.Str(" "), + pandoc.Link("ID", orcid_url), + } + else + local orcid_url = "https://orcid.org/" .. orcid_str + return { pandoc.Link(pandoc.Str(""), orcid_url, "", { class = "orcid" }) } + end +end + +M.default_marks = default_marks + +local function is_equal_contributor(author) + if has_key(author, "attributes") then + return author.attributes["equal-contributor"] + end + return nil +end + +local function create_equal_contributors_block(authors, mark) + local has_equal_contribs = List:new(authors):find_if(is_equal_contributor) + if not has_equal_contribs then + return nil + end + local contributors = { + pandoc.Superscript(mark("equal_contributor")), + pandoc.Space(), + pandoc.Str("These authors contributed equally to this work."), + } + return List:new({ pandoc.Para(contributors) }) +end +M.create_equal_contributors_block = create_equal_contributors_block + +local function intercalate(lists, elem) + local result = List:new({}) + for i = 1, (#lists - 1) do + result:extend(lists[i]) + result:extend(elem) + end + if #lists > 0 then + result:extend(lists[#lists]) + end + return result +end + +local function is_corresponding_author(author) + if has_key(author, "attributes") then + if author.attributes["corresponding"] then + return author.email + end + end + return nil +end +M.is_corresponding_author = is_corresponding_author + +local function create_correspondence_blocks(authors, mark) + local corresponding_authors = List:new({}) + for _, author in ipairs(authors) do + if is_corresponding_author(author) then + local mailto = "mailto:" .. stringify(author.email) + local author_with_mail = List:new( + author.name.literal + .. List:new({ pandoc.Space(), pandoc.Str("(") }) + .. author.email + .. List:new({ pandoc.Str(")") }) + ) + local link = pandoc.Link(author_with_mail, mailto) + table.insert(corresponding_authors, { link }) + end + end + if #corresponding_authors == 0 then + return nil + end + local correspondence = List:new({ + pandoc.Superscript(mark("corresponding_author")), + pandoc.Space(), + pandoc.Str("Corresponding to:"), + pandoc.Space(), + }) + local sep = List:new({ pandoc.Str(","), pandoc.Space() }) + return { pandoc.Para(correspondence .. intercalate(corresponding_authors, sep)) } +end + +M.create_correspondence_blocks = create_correspondence_blocks + +local function author_inline_generator(get_mark, meta) + return function(author) + local author_marks = List:new({}) + if has_key(author, "orcid") then + author_marks[#author_marks + 1] = get_orcid_mark(author.orcid) + end + local affilstyle = meta and meta.affilstyle and stringify(meta.affilstyle) or "alphabeta" + for _, idx in ipairs(author.affiliations) do + local idx_num = tonumber(stringify(idx)) -- Convert MetaString/MetaInlines to number + if not idx_num then + error("Invalid affiliation index: " .. tostring(idx)) + end + local idx_str + if affilstyle == "number" then + idx_str = tostring(idx_num) + else + if idx_num > 26 then + error("Too many affiliations: only up to 26 (a-z) are supported") + end + idx_str = string.char(96 + idx_num) + end + author_marks[#author_marks + 1] = { pandoc.Str(idx_str) } + end + if has_key(author, "attributes") then + if author.attributes["equal-contributor"] then + author_marks[#author_marks + 1] = get_mark("equal_contributor") + end + end + if is_corresponding_author(author) then + author_marks[#author_marks + 1] = get_mark("corresponding_author") + end + if FORMAT:match("latex") then + author.name.literal[#author.name.literal + 1] = pandoc.Superscript(intercalate(author_marks, { pandoc.Str(",") })) + return author + else + local res = List.clone(author.name.literal) + res[#res + 1] = pandoc.Superscript(intercalate(author_marks, { pandoc.Str(",") })) + return res + end + end +end +M.author_inline_generator = author_inline_generator + +local function create_authors_inlines(authors, mark, meta) + local inlines_generator = author_inline_generator(mark, meta) + local inlines = List:new(authors):map(inlines_generator) + local and_str = List:new({ pandoc.Space(), pandoc.Str("and"), pandoc.Space() }) + local last_author = inlines[#inlines] + inlines[#inlines] = nil + local result = intercalate(inlines, { pandoc.Str(","), pandoc.Space() }) + if #authors > 1 then + if #authors == 2 then + result:extend(and_str) + else + result:extend(List:new({ pandoc.Str(",") }) .. and_str) + end + end + result:extend(last_author) + return result +end +M.create_authors_inlines = create_authors_inlines + +local function create_affiliations_blocks_alphabeta(affiliations, meta) + local affilstyle = meta and meta.affilstyle and stringify(meta.affilstyle) or "alphabeta" + local affil_lines = List:new(affiliations):map(function(affil, i) + if affilstyle == "number" then + num_inlines = pandoc.List:new({ + pandoc.Superscript(pandoc.Str(tostring(i))), + pandoc.Space(), + }) + else + num_inlines = pandoc.List:new({ + pandoc.Superscript(pandoc.Str(string.char(96 + i))), + pandoc.Space(), + }) + end + local name_inlines = type(affil.name) == "table" and affil.name or { pandoc.Str(tostring(affil.name)) } + local city_inlines = type(affil.city) == "table" and affil.city or { pandoc.Str(tostring(affil.city)) } + local postcode_inlines = type(affil["postal-code"]) == "table" and affil["postal-code"] + or { pandoc.Str(tostring(affil["postal-code"])) } + local country_inlines = type(affil.country) == "table" and affil.country + or { pandoc.Str(tostring(affil.country or affil["postal-code"])) } + return num_inlines + :extend(name_inlines) + :extend({ pandoc.Str(", ") }) + :extend(city_inlines) + :extend({ pandoc.Space() }) + :extend(postcode_inlines) + :extend({ pandoc.Str(", ") }) + :extend(country_inlines) + :extend({ pandoc.Str(".") }) + end) + local combined_inlines = pandoc.List:new() + for i, line in ipairs(affil_lines) do + combined_inlines:extend(line) + if i < #affil_lines then + combined_inlines:extend({ pandoc.LineBreak() }) + end + end + return { pandoc.Para(combined_inlines) } +end + +local function create_affiliations_blocks_number(affiliations, meta) + local affilstyle = meta and meta.affilstyle and stringify(meta.affilstyle) or "alphabeta" + local affil_lines = List:new(affiliations):map(function(affil, i) + local num_inlines = pandoc.List:new({ + pandoc.Superscript(pandoc.Str(tostring(i))), + pandoc.Space(), + }) + local name_inlines = type(affil.name) == "table" and affil.name or { pandoc.Str(tostring(affil.name)) } + local city_inlines = type(affil.city) == "table" and affil.city or { pandoc.Str(tostring(affil.city)) } + local postcode_inlines = type(affil["postal-code"]) == "table" and affil["postal-code"] + or { pandoc.Str(tostring(affil["postal-code"])) } + local country_inlines = type(affil.country) == "table" and affil.country + or { pandoc.Str(tostring(affil.country or affil["postal-code"])) } + return num_inlines + :extend(name_inlines) + :extend({ pandoc.Str(", ") }) + :extend(city_inlines) + :extend({ pandoc.Space() }) + :extend(postcode_inlines) + :extend({ pandoc.Str(", ") }) + :extend(country_inlines) + :extend({ pandoc.Str(".") }) + end) + local combined_inlines = pandoc.List:new() + for i, line in ipairs(affil_lines) do + combined_inlines:extend(line) + if i < #affil_lines then + combined_inlines:extend({ pandoc.LineBreak() }) + end + end + return { pandoc.Para(combined_inlines) } +end + +M.create_affiliations_blocks = create_affiliations_blocks_alphabeta + +function Meta(meta) + local affilstyle = meta and meta.affilstyle and stringify(meta.affilstyle) or "alphabeta" + M.create_affiliations_blocks = affilstyle == "number" and create_affiliations_blocks_number + or create_affiliations_blocks_alphabeta + if meta.authors then + meta.author = create_authors_inlines(meta.authors, M.default_marks, meta) + end + if meta.affiliations then + meta.institute = M.create_affiliations_blocks(meta.affiliations, meta) + end + if meta.authors then + local equal_contributors = create_equal_contributors_block(meta.authors, M.default_marks) + if equal_contributors then + meta["equal-contributors"] = equal_contributors + end + local correspondence = create_correspondence_blocks(meta.authors, M.default_marks) + if correspondence then + meta.correspondence = correspondence + end + end + return meta +end + +return M diff --git a/_extensions/drwater/authoraffil/from_scholarly_metadata.lua b/_extensions/drwater/authoraffil/from_scholarly_metadata.lua new file mode 100644 index 0000000..a9dcf5b --- /dev/null +++ b/_extensions/drwater/authoraffil/from_scholarly_metadata.lua @@ -0,0 +1,51 @@ +--[[ +ScholarlyMeta – normalize author/affiliation meta variables +Copyright (c) 2017-2021 Albert Krewinkel, Robert Winkler +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. +]] + +local List = require("pandoc.List") +local utils = require("pandoc.utils") +local stringify = utils.stringify + +local M = {} + +local function has_id(id) + return function(x) + return x.id == id + end +end + +local function resolve_institutes(institute, known_institutes) + local unresolved_institutes + if institute == nil then + unresolved_institutes = {} + elseif type(institute) == "string" or type(institute) == "number" then + unresolved_institutes = { institute } + else + unresolved_institutes = institute + end + local result = List:new({}) + for i, inst in ipairs(unresolved_institutes) do + local intermed_val = known_institutes:find_if(has_id(stringify(inst))) + if intermed_val then + result[i] = pandoc.MetaString(tostring(intermed_val.index)) + else + result[i] = pandoc.MetaString(tostring(inst)) + end + end + return result +end +M.resolve_institutes = resolve_institutes + +return M + diff --git a/_extensions/drwater/authoraffil/template.qmd b/_extensions/drwater/authoraffil/template.qmd new file mode 100644 index 0000000..3ec43f5 --- /dev/null +++ b/_extensions/drwater/authoraffil/template.qmd @@ -0,0 +1,115 @@ +--- +title: "MANUSCRIPT TITLE" +subtitle: "Supplementary Information" +submitjournal: "JOURNAL" +submitid: +lang: en +date: "" +# bibliography: [BB/Ref.bib, BB/localRef.bib] +affilstyle: alphabeta # number +author: + - name: Xxxxx Yyyy + affiliations: + - ref: kleac + # email: 13586740928@163.com + attributes: + corresponding: false + equal-contributor: true + role: + - data-curation: lead + - methodology: lead + - formalanalysis: lead + - writingoriginal: equal + - writingediting: eqaul + - visualisation: supporting + - name: Ming Su + email: mingsu@rcees.ac.cn + url: https://drwater.net/team/ming-su/ + role: + - conceptualization: lead + - methodology: supporting + - formalanalysis: lead + - writingoriginal: equal + - writingediting: equal + - visualisation: lead + - projectadmin: lead + - supervision + affiliations: + - ref: kleac + - ref: ucas + attributes: + corresponding: true + equal-contributor: true + - name: Min Yang + email: yangmin@rcees.ac.cn + affiliations: + - ref: kleac + - ref: ucas + attributes: + corresponding: true +affiliations: + - id: kleac + name: State Key Laboratory of Environmental Aquatic Chemistry, Research Center for Eco-Environmental Sciences, Chinese Academy of Sciences + # address: No. 18 Shuangqing Road + city: Beijing + postal-code: 100085 + country: China + url: https://www.skleac.ac.cn + - id: ucas + name: University of Chinese Academy of Sciences + # address: No. 19A Yuquan Road + city: Beijing + postal-code: 100049 + country: China + url: https://www.ucas.ac.cn +prefer-html: true +format: + # elsevier-html: + # toc: true + # css: _extensions/drwater/dwms/inst/css/style.css + # docx: + # reference-doc: _extensions/drwater/dwms/inst/word/MS.docx + pdf: + fontsize: 12pt + keep-md: false + keep-tex: false +filters: + # - latex-environment + - authoraffil +--- + + +```{r} +#| include: false +#| cache: false + +lang <- "en" +isRendering <- isTRUE(getOption("knitr.in.progress")) +require(tidyverse) +require(drwateR) +require(patchwork) +rmdify::rmd_init() +dwfun::init() +``` + + +{{< pagebreak >}} + +# Abstract {-} + + +{{< pagebreak >}} + + +{{< pagebreak >}} + + + +# References {-} + +::: {#refs} +::: + +{{< pagebreak >}} + + diff --git a/_extensions/drwater/authoraffil/utils.lua b/_extensions/drwater/authoraffil/utils.lua new file mode 100644 index 0000000..2f5df89 --- /dev/null +++ b/_extensions/drwater/authoraffil/utils.lua @@ -0,0 +1,49 @@ +--[[ +authors-block – affiliations block extension for quarto +Copyright (c) 2023 Lorenz A. Kapsner +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. +]] + +local List = require("pandoc.List") +local utils = require("pandoc.utils") +local stringify = utils.stringify +local from_scholarly = require("from_scholarly_metadata") +local resolve_institutes = from_scholarly.resolve_institutes + +local M = {} + +local function normalize_affiliations(affiliations) + local affiliations_norm = List:new(affiliations or {}):map(function(affil, i) + affil.index = pandoc.MetaString(tostring(i)) + affil.id = pandoc.MetaString(stringify(affil.id or affil.name)) + return affil + end) + return affiliations_norm +end +M.normalize_affiliations = normalize_affiliations + +local function has_key(set, key) + return set[key] ~= nil +end +M.has_key = has_key + +local function normalize_authors(affiliations) + return function(auth) + auth.id = pandoc.MetaString(stringify(auth.name)) + auth.affiliations = resolve_institutes(auth.affiliations or {}, affiliations) + return auth + end +end +M.normalize_authors = normalize_authors + +return M + diff --git a/_extensions/drwater/autocorrect/_extension.yaml b/_extensions/drwater/autocorrect/_extension.yaml new file mode 100644 index 0000000..a4db887 --- /dev/null +++ b/_extensions/drwater/autocorrect/_extension.yaml @@ -0,0 +1,16 @@ +title: TO DO +authors: + - name: Ming Su + email: mingsu@rcees.ac.cn + orcid: 0000-0001-9821-1268 + url: https://drwater.net/team/ming-su/ + - name: Lorenz A. Kapsner + orcid: 0000-0003-1866-860X + - name: Albert Krewinkel + orcid: 0000-0002-9455-0796 + - name: Robert Winkler +version: 0.3.2 +quarto-required: ">=1.3.0" +contributes: + filters: + - autocorrect.py diff --git a/_extensions/drwater/autocorrect/autocorrect.py b/_extensions/drwater/autocorrect/autocorrect.py new file mode 100644 index 0000000..6c980e0 --- /dev/null +++ b/_extensions/drwater/autocorrect/autocorrect.py @@ -0,0 +1,61 @@ +# Improve copywriting, correct spaces, words, and punctuations between CJK and English with AutoCorrect + +# Copyright: © 2024–Present Tom Ben +# License: MIT License + +import autocorrect_py as autocorrect +import json +import panflute as pf +from panflute import elements as pf_elements + +# Allow typst and comment raw blocks until upstream panflute adds support. +ADDITIONAL_RAW_FORMATS = {'typst', 'comment'} +if hasattr(pf_elements, 'RAW_FORMATS'): + pf_elements.RAW_FORMATS = set(pf_elements.RAW_FORMATS) + pf_elements.RAW_FORMATS.update(ADDITIONAL_RAW_FORMATS) + + +def load_config(): + # yaml-language-server: $schema=https://huacnlee.github.io/autocorrect/schema.json + config = { + # 0 - off, 1 - error, 2 - warning + "rules": { + # Add space between some punctuations + "space-punctuation": 0, + # Add space between brackets (), [] when near the CJK + "space-bracket": 0, + # Add space between ``, when near the CJK + "space-backticks": 0, + # Add space between dash `-` + "space-dash": 0, + # Convert to fullwidth + "fullwidth": 0, + # To remove space arouned the fullwidth quotes “”, ‘’ + "no-space-fullwidth-quote": 0, + # Fullwidth alphanumeric characters to halfwidth + "halfwidth-word": 1, + # Fullwidth punctuations to halfwidth in English + "halfwidth-punctuation": 1, + # Spellcheck + "spellcheck": 0 + } + } + config_str = json.dumps(config) + autocorrect.load_config(config_str) + + +def correct_text(elem, doc): + if isinstance(elem, pf.Str): + # Apply autocorrect formatting to each text node + corrected_text = autocorrect.format(elem.text) + return pf.Str(corrected_text) + + +def main(doc=None): + # Load autocorrect configuration + load_config() + return pf.run_filter(correct_text, doc=doc) + + +if __name__ == "__main__": + main() diff --git a/_extensions/drwater/autocorrect/template.qmd b/_extensions/drwater/autocorrect/template.qmd new file mode 100644 index 0000000..0a1d636 --- /dev/null +++ b/_extensions/drwater/autocorrect/template.qmd @@ -0,0 +1,116 @@ +--- +title: "MANUSCRIPT TITLE" +subtitle: "Supplementary Information" +submitjournal: "JOURNAL" +submitid: +lang: en +date: "" +# bibliography: [BB/Ref.bib, BB/localRef.bib] +affilstyle: alphabeta # number +author: + - name: Xxxxx Yyyy + affiliations: + - ref: kleac + # email: 13586740928@163.com + attributes: + corresponding: false + equal-contributor: true + role: + - data-curation: lead + - methodology: lead + - formalanalysis: lead + - writingoriginal: equal + - writingediting: eqaul + - visualisation: supporting + - name: Ming Su + email: mingsu@rcees.ac.cn + url: https://drwater.net/team/ming-su/ + role: + - conceptualization: lead + - methodology: supporting + - formalanalysis: lead + - writingoriginal: equal + - writingediting: equal + - visualisation: lead + - projectadmin: lead + - supervision + affiliations: + - ref: kleac + - ref: ucas + attributes: + corresponding: true + equal-contributor: true + - name: Min Yang + email: yangmin@rcees.ac.cn + affiliations: + - ref: kleac + - ref: ucas + attributes: + corresponding: true +affiliations: + - id: kleac + name: State Key Laboratory of Environmental Aquatic Chemistry, Research Center for Eco-Environmental Sciences, Chinese Academy of Sciences + # address: No. 18 Shuangqing Road + city: Beijing + postal-code: 100085 + country: China + url: https://www.skleac.ac.cn + - id: ucas + name: University of Chinese Academy of Sciences + # address: No. 19A Yuquan Road + city: Beijing + postal-code: 100049 + country: China + url: https://www.ucas.ac.cn +prefer-html: true +format: + # elsevier-html: + # toc: true + # css: _extensions/drwater/dwms/inst/css/style.css + # docx: + # reference-doc: _extensions/drwater/dwms/inst/word/MS.docx + pdf: + fontsize: 12pt + keep-md: false + keep-tex: false +filters: + # - latex-environment + # - authoraffil + - autocorrect +--- + + +```{r} +#| include: false +#| cache: false + +lang <- "en" +isRendering <- isTRUE(getOption("knitr.in.progress")) +require(tidyverse) +require(drwateR) +require(patchwork) +rmdify::rmd_init() +dwfun::init() +``` + + +{{< pagebreak >}} + +# Abstract {-} + + +{{< pagebreak >}} + + +{{< pagebreak >}} + + + +# References {-} + +::: {#refs} +::: + +{{< pagebreak >}} + + diff --git a/_extensions/drwater/confetti/_extension.yml b/_extensions/drwater/confetti/_extension.yml new file mode 100644 index 0000000..ccadbfe --- /dev/null +++ b/_extensions/drwater/confetti/_extension.yml @@ -0,0 +1,24 @@ +title: Confetti +author: Bréant Arthur +version: 1.0.0 +quarto-required: ">=1.2.269" +contributes: + revealjs-plugins: + - name: RevealConfetti + script: + - confetti.js + config: + confetti: + particleCount: 150 + angle: 90 + spread: 360 + startVelocity: 25 + decay: 0.9 + gravity: 0.65 + drift: 0 + ticks: 400 + colors: ["#0366fc", "#f54281", "#1fd14f"] + shapes: null + scalar: 0.7 + zIndex: 100 + disableForReducedMotion: false diff --git a/_extensions/drwater/confetti/confetti.js b/_extensions/drwater/confetti/confetti.js new file mode 100644 index 0000000..8fab489 --- /dev/null +++ b/_extensions/drwater/confetti/confetti.js @@ -0,0 +1,50 @@ +var script = document.createElement("script"); +script.setAttribute("type", "text/javascript"); +script.setAttribute( + "src", + "https://cdn.jsdelivr.net/npm/canvas-confetti@1.5.1/dist/confetti.browser.min.js" +); +document.getElementsByTagName("head")[0].appendChild(script); + +function getPosition(event) { + posX = event.pageX; + posY = event.pageY; +} + +document.addEventListener("mousemove", getPosition, false); + +window.RevealConfetti = function () { + return { + id: "RevealConfetti", + init: function (deck) { + deck.addKeyBinding({ keyCode: 65, key: "A" }, () => { + const config = deck.getConfig(); + const options = config.confetti || {}; + + confetti({ + particleCount: options.particleCount, + angle: options.angle, + spread: options.spread, + startVelocity: options.startVelocity, + decay: options.decay, + gravity: options.gravity, + drift: options.drift, + ticks: options.ticks, + colors: options.colors, + shapes: options.shapes, + scalar: options.scalar, + zIndex: options.zIndex, + disableForReducedMotion: options.disableForReducedMotion, + origin: { + x: posX / window.innerWidth, + y: posY / window.innerHeight, + }, + }); + + console.log(`posX: ${posX} | posy: ${posY}`); + console.log(options); + console.log("🎊🎉"); + }); + }, + }; +}; diff --git a/_extensions/drwater/custom-fonts/_extension.yml b/_extensions/drwater/custom-fonts/_extension.yml new file mode 100644 index 0000000..2b122ab --- /dev/null +++ b/_extensions/drwater/custom-fonts/_extension.yml @@ -0,0 +1,7 @@ +title: Use Custom Fonts +author: Tom Ben +version: 1.0.0 +quarto-required: ">=1.5.0" +contributes: + filters: + - custom-fonts.lua diff --git a/_extensions/drwater/custom-fonts/custom-fonts.lua b/_extensions/drwater/custom-fonts/custom-fonts.lua new file mode 100644 index 0000000..72b1f32 --- /dev/null +++ b/_extensions/drwater/custom-fonts/custom-fonts.lua @@ -0,0 +1,40 @@ +--- Use custom fonts in DOCX, HTML, EPUB, LaTeX and Typst + +--- Copyright: © 2025–Present Tom Ben +--- License: MIT License + +function Span(span) + if span.classes:includes("fangsong") or span.classes:includes("kaiti") then + local text = pandoc.utils.stringify(span.content) + local isFangsong = span.classes:includes("fangsong") + + if FORMAT == "docx" then + local fontName = isFangsong and "FZFangSong-Z02" or "FZKai-Z03" + local openxml = string.format( + '%s', + fontName, text + ) + return pandoc.RawInline("openxml", openxml) + elseif FORMAT == "latex" or FORMAT == "pdf" then + -- For LaTeX/PDF output, use font commands provided by `ctex` + local fontCommand = isFangsong and "\\fangsong" or "\\kaishu" + local latex = string.format("{%s %s}", fontCommand, text) + return pandoc.RawInline("latex", latex) + elseif FORMAT == "html" or FORMAT == "epub" then + -- For HTML and EPUB output, use CSS font-family with fallback fonts + -- Note: EPUB readers may override these settings based on user preferences + local fontFamily = isFangsong and "FZFangSong-Z02, FangSong, STFangsong, 仿宋, serif" or + "FZKai-Z03, KaiTi, STKaiti, 楷体, serif" + span.attributes["style"] = string.format("font-family: %s;", fontFamily) + return span + elseif FORMAT == "typst" then + -- For Typst output, use text function with font parameter + local fontName = isFangsong and "FZFangSong-Z02" or "FZKai-Z03" + local typst = string.format("#text(font: \"%s\")[%s]", fontName, text) + return pandoc.RawInline("typst", typst) + else + -- For other formats, preserve the original span with classes + return span + end + end +end diff --git a/_extensions/drwater/docx-quotes/_extension.yml b/_extensions/drwater/docx-quotes/_extension.yml new file mode 100644 index 0000000..c923809 --- /dev/null +++ b/_extensions/drwater/docx-quotes/_extension.yml @@ -0,0 +1,7 @@ +title: Convert Straight Angle Quotes to Curly Quotes in DOCX +author: Tom Ben +version: 1.0.0 +quarto-required: ">=1.5.0" +contributes: + filters: + - docx-quotes.lua diff --git a/_extensions/drwater/docx-quotes/docx-quotes.lua b/_extensions/drwater/docx-quotes/docx-quotes.lua new file mode 100644 index 0000000..a586d32 --- /dev/null +++ b/_extensions/drwater/docx-quotes/docx-quotes.lua @@ -0,0 +1,24 @@ +--- Convert straight angle quotation marks to curly quotation marks in DOCX + +--- Copyright: © 2025–Present Tom Ben +--- License: MIT License + +function Str(el) + -- If not DOCX output, return element unchanged + if not FORMAT:match('docx') then + return el + end + + local replacements = { + ['「'] = '“', + ['」'] = '”', + ['『'] = '‘', + ['』'] = '’' + } + + for original, replacement in pairs(replacements) do + el.text = el.text:gsub(original, replacement) + end + + return el +end diff --git a/_extensions/drwater/dwev/.gitignore b/_extensions/drwater/dwev/.gitignore new file mode 100644 index 0000000..6b55381 --- /dev/null +++ b/_extensions/drwater/dwev/.gitignore @@ -0,0 +1,7 @@ +demo/*.pdf +/*_files +/figure/ +/*.pdf + + + diff --git a/_extensions/drwater/dwev/_extension.yml b/_extensions/drwater/dwev/_extension.yml new file mode 100644 index 0000000..06ab037 --- /dev/null +++ b/_extensions/drwater/dwev/_extension.yml @@ -0,0 +1,7 @@ +title: eisvogel template for drwater +author: Ming Su +version: 0.0.1 +contributes: + formats: + pdf: + template: _extensions/drwater/dwev/dweisvogel.tex diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/_extension.yml b/_extensions/drwater/dwev/_extensions/drwater/dwev/_extension.yml new file mode 100644 index 0000000..06ab037 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/_extension.yml @@ -0,0 +1,7 @@ +title: eisvogel template for drwater +author: Ming Su +version: 0.0.1 +contributes: + formats: + pdf: + template: _extensions/drwater/dwev/dweisvogel.tex diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/dweisvogel.tex b/_extensions/drwater/dwev/_extensions/drwater/dwev/dweisvogel.tex new file mode 100644 index 0000000..50b9664 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/dweisvogel.tex @@ -0,0 +1,1323 @@ +%% +% Copyright (c) 2017 - 2024, Pascal Wagler; +% Copyright (c) 2014 - 2024, John MacFarlane +% +% All rights reserved. +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions +% are met: +% +% - Redistributions of source code must retain the above copyright +% notice, this list of conditions and the following disclaimer. +% +% - Redistributions in binary form must reproduce the above copyright +% notice, this list of conditions and the following disclaimer in the +% documentation and/or other materials provided with the distribution. +% +% - Neither the name of John MacFarlane nor the names of other +% contributors may be used to endorse or promote products derived +% from this software without specific prior written permission. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +% "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +% FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +% COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +% INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +% LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +% ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE. +%% + +%% +% This is the Eisvogel pandoc LaTeX template. +% +% For usage information and examples visit the official GitHub page: +% https://github.com/Wandmalfarbe/pandoc-latex-template +%% + +% Options for packages loaded elsewhere +\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref} +\PassOptionsToPackage{hyphens}{url} +\PassOptionsToPackage{dvipsnames,svgnames,x11names,table}{xcolor} +$if(CJKmainfont)$ +\PassOptionsToPackage{space}{xeCJK} +$endif$ +% +\documentclass[ +$if(fontsize)$ + $fontsize$, +$endif$ +$if(papersize)$ + $papersize$paper, +$else$ + paper=a4, +$endif$ +$if(beamer)$ + ignorenonframetext, +$if(handout)$ + handout, +$endif$ +$if(aspectratio)$ + aspectratio=$aspectratio$, +$endif$ +$if(babel-lang)$ + $babel-lang$, +$endif$ +$endif$ +$for(classoption)$ + $classoption$$sep$, +$endfor$ + ,captions=tableheading +]{$if(beamer)$$documentclass$$else$$if(isbook)$scrbook$else$scrartcl$endif$$endif$} +$if(beamer)$ +$if(background-image)$ +\usebackgroundtemplate{% + \includegraphics[width=\paperwidth]{$background-image$}% +} +% In beamer background-image does not work well when other images are used, so this is the workaround +\pgfdeclareimage[width=\paperwidth,height=\paperheight]{background}{$background-image$} +\usebackgroundtemplate{\pgfuseimage{background}} +$endif$ + +\usepackage{pgfpages} +\setbeamertemplate{caption}[numbered] +\setbeamertemplate{caption label separator}{: } +\setbeamercolor{caption name}{fg=normal text.fg} +\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$ +$for(beameroption)$ +\setbeameroption{$beameroption$} +$endfor$ +% Prevent slide breaks in the middle of a paragraph +\widowpenalties 1 10000 +\raggedbottom +$if(section-titles)$ +\setbeamertemplate{part page}{ + \centering + \begin{beamercolorbox}[sep=16pt,center]{part title} + \usebeamerfont{part title}\insertpart\par + \end{beamercolorbox} +} +\setbeamertemplate{section page}{ + \centering + \begin{beamercolorbox}[sep=12pt,center]{section title} + \usebeamerfont{section title}\insertsection\par + \end{beamercolorbox} +} +\setbeamertemplate{subsection page}{ + \centering + \begin{beamercolorbox}[sep=8pt,center]{subsection title} + \usebeamerfont{subsection title}\insertsubsection\par + \end{beamercolorbox} +} +\AtBeginPart{ + \frame{\partpage} +} +\AtBeginSection{ + \ifbibliography + \else + \frame{\sectionpage} + \fi +} +\AtBeginSubsection{ + \frame{\subsectionpage} +} +$endif$ +$endif$ +$if(beamerarticle)$ +\usepackage{beamerarticle} % needs to be loaded first +$endif$ +\usepackage{amsmath,amssymb} +$if(linestretch)$ +\usepackage{setspace} +$else$ +% Use setspace anyway because we change the default line spacing. +% The spacing is changed early to affect the titlepage and the TOC. +\usepackage{setspace} +\setstretch{1.2} +$endif$ +\usepackage{iftex} +\ifPDFTeX + \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provide euro and other symbols +\else % if luatex or xetex +$if(mathspec)$ + \ifXeTeX + \usepackage{mathspec} % this also loads fontspec + \else + \usepackage{unicode-math} % this also loads fontspec + \fi +$else$ + \usepackage{unicode-math} % this also loads fontspec +$endif$ + \defaultfontfeatures{Scale=MatchLowercase}$-- must come before Beamer theme + \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} +\fi +$if(fontfamily)$ +$else$ +$-- Set default font before Beamer theme so the theme can override it +\usepackage{lmodern} +$endif$ +$-- Set Beamer theme before user font settings so they can override theme +$if(beamer)$ +$if(theme)$ +\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$} +$endif$ +$if(colortheme)$ +\usecolortheme{$colortheme$} +$endif$ +$if(fonttheme)$ +\usefonttheme{$fonttheme$} +$endif$ +$if(mainfont)$ +\usefonttheme{serif} % use mainfont rather than sansfont for slide text +$endif$ +$if(innertheme)$ +\useinnertheme{$innertheme$} +$endif$ +$if(outertheme)$ +\useoutertheme{$outertheme$} +$endif$ +$endif$ +$-- User font settings (must come after default font and Beamer theme) +$if(fontfamily)$ +\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} +$endif$ +\ifPDFTeX\else + % xetex/luatex font selection +$if(mainfont)$ + $if(mainfontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("mainfontfallback",{ + $for(mainfontfallback)$"$mainfontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$} +$endif$ +$if(sansfont)$ + $if(sansfontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("sansfontfallback",{ + $for(sansfontfallback)$"$sansfontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$$if(sansfontfallback)$,RawFeature={fallback=sansfontfallback}$endif$]{$sansfont$} +$endif$ +$if(monofont)$ + $if(monofontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("monofontfallback",{ + $for(monofontfallback)$"$monofontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$if(monofontfallback)$,RawFeature={fallback=monofontfallback}$endif$]{$monofont$} +$endif$ +$for(fontfamilies)$ + \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$} +$endfor$ +$if(mathfont)$ +$if(mathspec)$ + \ifXeTeX + \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \else + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \fi +$else$ + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} +$endif$ +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + \usepackage{xeCJK} + \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + $if(CJKsansfont)$ + \setCJKsansfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKsansfont$} + $endif$ + $if(CJKmonofont)$ + \setCJKmonofont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmonofont$} + $endif$ + \fi +$endif$ +$if(luatexjapresetoptions)$ + \ifLuaTeX + \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset} + \fi +$endif$ +$if(CJKmainfont)$ + \ifLuaTeX + \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec} + \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +\fi +$if(zero-width-non-joiner)$ +%% Support for zero-width non-joiner characters. +\makeatletter +\def\zerowidthnonjoiner{% + % Prevent ligatures and adjust kerning, but still support hyphenating. + \texorpdfstring{% + \TextOrMath{\nobreak\discretionary{-}{}{\kern.03em}% + \ifvmode\else\nobreak\hskip\z@skip\fi}{}% + }{}% +} +\makeatother +\ifPDFTeX + \DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner} +\else + \catcode`^^^^200c=\active + \protected\def ^^^^200c{\zerowidthnonjoiner} +\fi +%% End of ZWNJ support +$endif$ +% Use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\IfFileExists{microtype.sty}{% use microtype if available + \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype} + \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +$if(indent)$ +$else$ +\makeatletter +\@ifundefined{KOMAClassName}{% if non-KOMA class + \IfFileExists{parskip.sty}{% + \usepackage{parskip} + }{% else + \setlength{\parindent}{0pt} + \setlength{\parskip}{6pt plus 2pt minus 1pt}} +}{% if KOMA class + \KOMAoptions{parskip=half}} +\makeatother +$endif$ +$if(verbatim-in-note)$ +\usepackage{fancyvrb} +$endif$ +\usepackage{xcolor} +\definecolor{default-linkcolor}{HTML}{A50000} +\definecolor{default-filecolor}{HTML}{A50000} +\definecolor{default-citecolor}{HTML}{4077C0} +\definecolor{default-urlcolor}{HTML}{4077C0} +$if(footnotes-pretty)$ +% load footmisc in order to customize footnotes (footmisc has to be loaded before hyperref, cf. https://tex.stackexchange.com/a/169124/144087) +\usepackage[hang,flushmargin,bottom,multiple]{footmisc} +\setlength{\footnotemargin}{0.8em} % set space between footnote nr and text +\setlength{\footnotesep}{\baselineskip} % set space between multiple footnotes +\setlength{\skip\footins}{0.3cm} % set space between page content and footnote +\setlength{\footskip}{0.9cm} % set space between footnote and page bottom +$endif$ +$if(geometry)$ +$if(beamer)$ +\geometry{$for(geometry)$$geometry$$sep$,$endfor$} +$else$ +\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$else$ +$if(beamer)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering,$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$endif$ +$if(titlepage-logo)$ +\usepackage[export]{adjustbox} +\usepackage{graphicx} +$endif$ +$if(beamer)$ +\newif\ifbibliography +$endif$ +$if(listings)$ +\usepackage{listings} +\newcommand{\passthrough}[1]{#1} +\lstset{defaultdialect=[5.3]Lua} +\lstset{defaultdialect=[x86masm]Assembler} +$endif$ +$if(listings-no-page-break)$ +\usepackage{etoolbox} +\BeforeBeginEnvironment{lstlisting}{\par\noindent\begin{minipage}{\linewidth}} +\AfterEndEnvironment{lstlisting}{\end{minipage}\par\addvspace{\topskip}} +$endif$ +$if(lhs)$ +\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} +$endif$ +$if(highlighting-macros)$ +$highlighting-macros$ + +% Workaround/bugfix from jannick0. +% See https://github.com/jgm/pandoc/issues/4302#issuecomment-360669013) +% or https://github.com/Wandmalfarbe/pandoc-latex-template/issues/2 +% +% Redefine the verbatim environment 'Highlighting' to break long lines (with +% the help of fvextra). Redefinition is necessary because it is unlikely that +% pandoc includes fvextra in the default template. +\usepackage{fvextra} +\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,fontsize=$if(code-block-font-size)$$code-block-font-size$$else$\small$endif$,commandchars=\\\{\}} + +$endif$ + +% 为中文添加支持 by Ming Su +$if(CJK)$ +$if(isbook)$ +\usepackage{ctex} %调用中文字体宏包 +\usepackage{indentfirst} %调用首行缩进宏包 +\usepackage{ctex} % 确保中文字体支持 +\usepackage{zhnumber} +% 修改 chapter 格式为 "第X章" +% \renewcommand{\chapterformat}{第~\thechapter~章} +% \renewcommand{\chapterformat}{第\zhnumber{\thechapter}章} +\renewcommand{\chaptermarkformat}{第~\zhnumber{\thechapter}~章} +\renewcommand{\chapterformat}{第\zhnumber{\thechapter}章} +\renewcommand*{\chapterlinesformat}[3]{% + \parbox{\linewidth}{\centering #2~\quad~#3} % 居中 + "·" 分隔 + % 或改用冒号分隔: + % \parbox{\linewidth}{\centering #2:#3} +} +\RedeclareSectionCommand[ + beforeskip=1.5em plus 0.5em minus 0.5em, + afterskip=1em plus 0.2em, + font=\large\bfseries +]{section} +\usepackage{zhnumber} % 确保已加载(或直接用 ctex) +% 修改目录中的章节编号为中文 +\addtokomafont{chapterentry}{\normalfont} % 可选:调整目录字体 +\renewcommand*{\chapterformat}{第\zhnumber{\thechapter}章} % 正文标题格式 +\renewcommand*{\chaptermarkformat}{第\zhnumber{\thechapter}章\quad} % 页眉标题格式 +% 关键!覆盖目录中的章节编号 +\renewcommand{\addchaptertocentry}[2]{% + \addtocentrydefault{chapter}{第\zhnumber{#1}章}{#2}% +} +\RedeclareSectionCommand[ + tocentryindent=0pt, + tocentrynumwidth=3.5em % 确保编号区域足够宽 +]{chapter} +$endif$ +$endif$ + +$if(tables)$ +\usepackage{longtable,booktabs,array} +$if(multirow)$ +\usepackage{multirow} +$endif$ +\usepackage{calc} % for calculating minipage widths +$if(beamer)$ +\usepackage{caption} +% Make caption package work with longtable +\makeatletter +\def\fnum@table{\tablename~\thetable} +\makeatother +$else$ +% Correct order of tables after \paragraph or \subparagraph +\usepackage{etoolbox} +\makeatletter +\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} +\makeatother +% Allow footnotes in longtable head/foot +\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} +\makesavenoteenv{longtable} +$endif$ +$endif$ +% add backlinks to footnote references, cf. https://tex.stackexchange.com/questions/302266/make-footnote-clickable-both-ways +$if(footnotes-disable-backlinks)$ +$else$ +\usepackage{footnotebackref} +$endif$ +$if(graphics)$ +\usepackage{graphicx} +\makeatletter +% \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +% \def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +% \makeatother +% % Scale images if necessary, so that they will not overflow the page +% % margins by default, and it is still possible to overwrite the defaults +% % using explicit options in \includegraphics[width, height, ...]{} +% \setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +\newsavebox\pandoc@box +\newcommand*\pandocbounded[1]{% scales image to fit in text height/width + \sbox\pandoc@box{#1}% + \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% + \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% + \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both + \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% + \else\usebox{\pandoc@box}% + \fi% +} +% Set default figure placement to htbp +\makeatletter +\def\fps@figure{htbp} +\makeatother +% \makeatletter Old options from template, replaced with quarto defaults above +% \newsavebox\pandoc@box +% \newcommand*\pandocbounded[1]{% scales image to fit in text height/width +% \sbox\pandoc@box{#1}% +% \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% +% \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% +% \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both +% \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% +% \else\usebox{\pandoc@box}% +% \fi% +% } +% % Set default figure placement to htbp +% % Make use of float-package and set default placement for figures to H. +% % The option H means 'PUT IT HERE' (as opposed to the standard h option which means 'You may put it here if you like'). +% \usepackage{float} +% \floatplacement{figure}{$if(float-placement-figure)$$float-placement-figure$$else$H$endif$} +% \makeatother +$endif$ +$if(svg)$ +\usepackage{svg} +$endif$ +$if(strikeout)$ +$-- also used for underline +\ifLuaTeX + \usepackage{luacolor} + \usepackage[soul]{lua-ul} +\else +\usepackage{soul} +$if(beamer)$ + \makeatletter + \let\HL\hl + \renewcommand\hl{% fix for beamer highlighting + \let\set@color\beamerorig@set@color + \let\reset@color\beamerorig@reset@color + \HL} + \makeatother +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + % soul's \st doesn't work for CJK: + \usepackage{xeCJKfntef} + \renewcommand{\st}[1]{\sout{#1}} + \fi +$endif$ +\fi +$endif$ +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +$if(numbersections)$ +\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$} +$else$ +\setcounter{secnumdepth}{-\maxdimen} % remove section numbering +$endif$ +$if(subfigure)$ +\usepackage{subcaption} +$endif$ +$if(beamer)$ +$else$ +$if(block-headings)$ +% Make \paragraph and \subparagraph free-standing +\makeatletter +\ifx\paragraph\undefined\else + \let\oldparagraph\paragraph + \renewcommand{\paragraph}{ + \@ifstar + \xxxParagraphStar + \xxxParagraphNoStar + } + \newcommand{\xxxParagraphStar}[1]{\oldparagraph*{#1}\mbox{}} + \newcommand{\xxxParagraphNoStar}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else + \let\oldsubparagraph\subparagraph + \renewcommand{\subparagraph}{ + \@ifstar + \xxxSubParagraphStar + \xxxSubParagraphNoStar + } + \newcommand{\xxxSubParagraphStar}[1]{\oldsubparagraph*{#1}\mbox{}} + \newcommand{\xxxSubParagraphNoStar}[1]{\oldsubparagraph{#1}\mbox{}} +\fi +\makeatother +$endif$ +$endif$ +$if(pagestyle)$ +\pagestyle{$pagestyle$} +$endif$ +$if(csl-refs)$ +% definitions for citeproc citations +\NewDocumentCommand\citeproctext{}{} +\NewDocumentCommand\citeproc{mm}{% + \begingroup\def\citeproctext{#2}\cite{#1}\endgroup} +\makeatletter + % allow citations to break across lines + \let\@cite@ofmt\@firstofone + % avoid brackets around text for \cite: + \def\@biblabel#1{} + \def\@cite#1#2{{#1\if@tempswa , #2\fi}} +\makeatother +\newlength{\cslhangindent} +\setlength{\cslhangindent}{1.5em} +\newlength{\csllabelwidth} +\setlength{\csllabelwidth}{3em} +\newenvironment{CSLReferences}[2] % #1 hanging-indent, #2 entry-spacing + {\begin{list}{}{% + \setlength{\itemindent}{0pt} + \setlength{\leftmargin}{0pt} + \setlength{\parsep}{0pt} + % turn on hanging indent if param 1 is 1 + \ifodd #1 + \setlength{\leftmargin}{\cslhangindent} + \setlength{\itemindent}{-1\cslhangindent} + \fi + % set entry spacing + \setlength{\itemsep}{#2\baselineskip}}} + {\end{list}} +\usepackage{calc} +\newcommand{\CSLBlock}[1]{\hfill\break\parbox[t]{\linewidth}{\strut\ignorespaces#1\strut}} +\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{\strut#1\strut}} +\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{\strut#1\strut}} +\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1} +$endif$ +$if(lang)$ +\ifLuaTeX +\usepackage[bidi=basic]{babel} +\else +\usepackage[bidi=default]{babel} +\fi +$if(babel-lang)$ +\babelprovide[main,import]{$babel-lang$} +$if(mainfont)$ +\ifPDFTeX +\else +\babelfont{rm}[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$} +\fi +$endif$ +$endif$ +$for(babel-otherlangs)$ +\babelprovide[import]{$babel-otherlangs$} +$endfor$ +$for(babelfonts/pairs)$ +\babelfont[$babelfonts.key$]{rm}{$babelfonts.value$} +$endfor$ +% get rid of language-specific shorthands (see #6817): +\let\LanguageShortHands\languageshorthands +\def\languageshorthands#1{} +$if(selnolig-langs)$ +\ifLuaTeX + \usepackage[$for(selnolig-langs)$$it$$sep$,$endfor$]{selnolig} % disable illegal ligatures +\fi +$endif$ +$endif$ +$for(header-includes)$ +$header-includes$ +$endfor$ +$if(dir)$ +\ifPDFTeX + \TeXXeTstate=1 + \newcommand{\RL}[1]{\beginR #1\endR} + \newcommand{\LR}[1]{\beginL #1\endL} + \newenvironment{RTL}{\beginR}{\endR} + \newenvironment{LTR}{\beginL}{\endL} +\fi +$endif$ +$if(natbib)$ +\usepackage[$natbiboptions$]{natbib} +\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} +$endif$ +$if(biblatex)$ +\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} +$for(bibliography)$ +\addbibresource{$bibliography$} +$endfor$ +$endif$ +$if(nocite-ids)$ +\nocite{$for(nocite-ids)$$it$$sep$, $endfor$} +$endif$ +$if(csquotes)$ +\usepackage{csquotes} +$endif$ +\usepackage{bookmark} +\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available +\urlstyle{$if(urlstyle)$$urlstyle$$else$same$endif$} +$if(links-as-notes)$ +% Make links footnotes instead of hotlinks: +\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}} +$endif$ +$if(verbatim-in-note)$ +\VerbatimFootnotes % allow verbatim text in footnotes +$endif$ +\hypersetup{ +$if(title-meta)$ + pdftitle={$title-meta$}, +$endif$ +$if(author-meta)$ + pdfauthor={$author-meta$}, +$endif$ +$if(lang)$ + pdflang={$lang$}, +$endif$ +$if(subject)$ +pdfsubject={$subject$}, +$endif$ +$if(keywords)$ + pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$}, +$endif$ +$if(colorlinks)$ + colorlinks=true, + linkcolor={$if(linkcolor)$$linkcolor$$else$default-linkcolor$endif$}, + filecolor={$if(filecolor)$$filecolor$$else$default-filecolor$endif$}, + citecolor={$if(citecolor)$$citecolor$$else$default-citecolor$endif$}, + urlcolor={$if(urlcolor)$$urlcolor$$else$default-urlcolor$endif$}, +$else$ +$if(boxlinks)$ +$else$ + hidelinks, +$endif$ +$endif$ + breaklinks=true, + pdfcreator={LaTeX via pandoc with the Eisvogel template}} +$if(title)$ +\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} +$endif$ +$if(subtitle)$ +$if(beamer)$ +$else$ +\usepackage{etoolbox} +\makeatletter +\providecommand{\subtitle}[1]{% add subtitle to \maketitle + \apptocmd{\@title}{\par {\large #1 \par}}{}{} +} +\makeatother +$endif$ +\subtitle{$subtitle$} +$endif$ +\author{$for(author)$$author$$sep$ \and $endfor$} +\date{$date$} +$if(beamer)$ +$if(institute)$ +\institute{$for(institute)$$institute$$sep$ \and $endfor$} +$endif$ +$if(titlegraphic)$ +\titlegraphic{\includegraphics$if(titlegraphicoptions)$[$for(titlegraphicoptions)$$titlegraphicoptions$$sep$, $endfor$]$endif${$titlegraphic$}} +$endif$ +$if(logo)$ +\logo{\includegraphics{$logo$}} +$endif$ +$endif$ + + + +%% +%% added +%% + +$if(page-background)$ +\usepackage[pages=all]{background} +$endif$ + +% +% for the background color of the title page +% +$if(titlepage)$ +\usepackage{pagecolor} +\usepackage{afterpage} +$if(titlepage-background)$ +\usepackage{tikz} +$endif$ +$if(geometry)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering]{geometry} +$endif$ +$endif$ + +% +% break urls +% +\PassOptionsToPackage{hyphens}{url} + +% +% When using babel or polyglossia with biblatex, loading csquotes is recommended +% to ensure that quoted texts are typeset according to the rules of your main language. +% +\usepackage{csquotes} + +% +% captions +% +\definecolor{caption-color}{HTML}{777777} +$if(beamer)$ +$else$ +\usepackage[font={stretch=1.2}, textfont={color=caption-color}, position=top, skip=4mm, labelfont=bf, singlelinecheck=false, justification=$if(caption-justification)$$caption-justification$$else$raggedright$endif$]{caption} +\setcapindent{0em} +$endif$ + +% +% blockquote +% +\definecolor{blockquote-border}{RGB}{221,221,221} +\definecolor{blockquote-text}{RGB}{119,119,119} +\usepackage{mdframed} +\newmdenv[rightline=false,bottomline=false,topline=false,linewidth=3pt,linecolor=blockquote-border,skipabove=\parskip]{customblockquote} +\renewenvironment{quote}{\begin{customblockquote}\list{}{\rightmargin=0em\leftmargin=0em}% +\item\relax\color{blockquote-text}\ignorespaces}{\unskip\unskip\endlist\end{customblockquote}} + +% +% Source Sans Pro as the default font family +% Source Code Pro for monospace text +% +% 'default' option sets the default +% font family to Source Sans Pro, not \sfdefault. +% +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + $if(fontfamily)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + $endif$ +\else % if not pdftex + $if(mainfont)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + + % XeLaTeX specific adjustments for straight quotes: https://tex.stackexchange.com/a/354887 + % This issue is already fixed (see https://github.com/silkeh/latex-sourcecodepro/pull/5) but the + % fix is still unreleased. + % TODO: Remove this workaround when the new version of sourcecodepro is released on CTAN. + \ifxetex + \makeatletter + \defaultfontfeatures[\ttfamily] + { Numbers = \sourcecodepro@figurestyle, + Scale = \SourceCodePro@scale, + Extension = .otf } + \setmonofont + [ UprightFont = *-\sourcecodepro@regstyle, + ItalicFont = *-\sourcecodepro@regstyle It, + BoldFont = *-\sourcecodepro@boldstyle, + BoldItalicFont = *-\sourcecodepro@boldstyle It ] + {SourceCodePro} + \makeatother + \fi + $endif$ +\fi + + +% setup for chinese font, by Ming +\setCJKmainfont{$CJKmainfont$}[BoldFont=$CJKboldfont$, ItalicFont=$CJKitalicfont$] + +% +% heading color +% +\definecolor{heading-color}{RGB}{40,40,40} +$if(beamer)$ +$else$ +\addtokomafont{section}{\color{heading-color}} +$endif$ +% When using the classes report, scrreprt, book, +% scrbook or memoir, uncomment the following line. +%\addtokomafont{chapter}{\color{heading-color}} + +% +% variables for title, author and date +% +$if(beamer)$ +$else$ +\usepackage{titling} +\title{$title$} +\author{$for(author)$$author$$sep$, $endfor$} +\date{$date$} +$endif$ + +% +% tables +% +$if(tables)$ + +\definecolor{table-row-color}{HTML}{F5F5F5} +\definecolor{table-rule-color}{HTML}{999999} + +%\arrayrulecolor{black!40} +\arrayrulecolor{table-rule-color} % color of \toprule, \midrule, \bottomrule +\setlength\heavyrulewidth{0.3ex} % thickness of \toprule, \bottomrule +\renewcommand{\arraystretch}{1.3} % spacing (padding) + +$if(table-use-row-colors)$ +% Unfortunately the colored cells extend beyond the edge of the +% table because pandoc uses @-expressions (@{}) like so: +% +% \begin{longtable}[]{@{}ll@{}} +% \end{longtable} +% +% https://en.wikibooks.org/wiki/LaTeX/Tables#.40-expressions +\usepackage{etoolbox} +\AtBeginEnvironment{longtable}{\rowcolors{2}{}{table-row-color!100}} +\preto{\toprule}{\hiderowcolors}{}{} +\appto{\endhead}{\showrowcolors}{}{} +\appto{\endfirsthead}{\showrowcolors}{}{} +$endif$ +$endif$ + +% +% remove paragraph indentation +% +% \setlength{\parindent}{0pt} +$if(parindent)$ +\setlength{\parindent}{2em} %设置首行缩进为2字符 +$else$ +\setlength{\parindent}{0pt} +$endif$ +\setlength{\parskip}{6pt plus 2pt minus 1pt} +\setlength{\emergencystretch}{3em} % prevent overfull lines + + + +% +% +% Listings +% +% + +$if(listings)$ + +% +% general listing colors +% +\definecolor{listing-background}{HTML}{F7F7F7} +\definecolor{listing-rule}{HTML}{B3B2B3} +\definecolor{listing-numbers}{HTML}{B3B2B3} +\definecolor{listing-text-color}{HTML}{000000} +\definecolor{listing-keyword}{HTML}{435489} +\definecolor{listing-keyword-2}{HTML}{1284CA} % additional keywords +\definecolor{listing-keyword-3}{HTML}{9137CB} % additional keywords +\definecolor{listing-identifier}{HTML}{435489} +\definecolor{listing-string}{HTML}{00999A} +\definecolor{listing-comment}{HTML}{8E8E8E} + +\lstdefinestyle{eisvogel_listing_style}{ + language = java, +$if(listings-disable-line-numbers)$ + xleftmargin = 0.6em, + framexleftmargin = 0.4em, +$else$ + numbers = left, + xleftmargin = 2.7em, + framexleftmargin = 2.5em, +$endif$ + backgroundcolor = \color{listing-background}, + basicstyle = \color{listing-text-color}\linespread{1.0}% + \lst@ifdisplaystyle% + $if(code-block-font-size)$$code-block-font-size$$else$\small$endif$% + \fi\ttfamily{}, + breaklines = true, + frame = single, + framesep = 0.19em, + rulecolor = \color{listing-rule}, + frameround = ffff, + tabsize = 4, + numberstyle = \color{listing-numbers}, + aboveskip = 1.0em, + belowskip = 0.1em, + abovecaptionskip = 0em, + belowcaptionskip = 1.0em, + keywordstyle = {\color{listing-keyword}\bfseries}, + keywordstyle = {[2]\color{listing-keyword-2}\bfseries}, + keywordstyle = {[3]\color{listing-keyword-3}\bfseries\itshape}, + sensitive = true, + identifierstyle = \color{listing-identifier}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + showstringspaces = false, + escapeinside = {/*@}{@*/}, % Allow LaTeX inside these special comments + literate = + {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 + {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 + {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 + {À}{{\`A}}1 {È}{{\`E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 + {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1 + {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1 + {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1 + {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1 + {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1 + {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1 + {€}{{\EUR}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1 + {»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1 + {…}{{\ldots}}1 {≥}{{>=}}1 {≤}{{<=}}1 {„}{{\glqq}}1 {“}{{\grqq}}1 + {”}{{''}}1 +} +\lstset{style=eisvogel_listing_style} + +% +% Java (Java SE 12, 2019-06-22) +% +\lstdefinelanguage{Java}{ + morekeywords={ + % normal keywords (without data types) + abstract,assert,break,case,catch,class,continue,default, + do,else,enum,exports,extends,final,finally,for,if,implements, + import,instanceof,interface,module,native,new,package,private, + protected,public,requires,return,static,strictfp,super,switch, + synchronized,this,throw,throws,transient,try,volatile,while, + % var is an identifier + var + }, + morekeywords={[2] % data types + % primitive data types + boolean,byte,char,double,float,int,long,short, + % String + String, + % primitive wrapper types + Boolean,Byte,Character,Double,Float,Integer,Long,Short + % number types + Number,AtomicInteger,AtomicLong,BigDecimal,BigInteger,DoubleAccumulator,DoubleAdder,LongAccumulator,LongAdder,Short, + % other + Object,Void,void + }, + morekeywords={[3] % literals + % reserved words for literal values + null,true,false, + }, + sensitive, + morecomment = [l]//, + morecomment = [s]{/*}{*/}, + morecomment = [s]{/**}{*/}, + morestring = [b]", + morestring = [b]', +} + +\lstdefinelanguage{XML}{ + morestring = [b]", + moredelim = [s][\bfseries\color{listing-keyword}]{<}{\ }, + moredelim = [s][\bfseries\color{listing-keyword}]{}, + moredelim = [l][\bfseries\color{listing-keyword}]{/>}, + moredelim = [l][\bfseries\color{listing-keyword}]{>}, + morecomment = [s]{}, + morecomment = [s]{}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + identifierstyle = \color{listing-identifier} +} +$endif$ + +% +% header and footer +% +$if(beamer)$ +$else$ +$if(disable-header-and-footer)$ +$else$ +\usepackage[headsepline,footsepline]{scrlayer-scrpage} + +\newpairofpagestyles{eisvogel-header-footer}{ + \clearpairofpagestyles + \ihead*{$if(header-left)$$header-left$$else$$title$$endif$} + \chead*{$if(header-center)$$header-center$$else$$endif$} + \ohead*{$if(header-right)$$header-right$$else$$date$$endif$} + \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot*{$if(footer-center)$$footer-center$$else$$endif$} + \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \addtokomafont{pageheadfoot}{\upshape} +} +\pagestyle{eisvogel-header-footer} + +\newpairofpagestyles{eisvogel-chapterpage-header-footer}{ + \clearpairofpagestyles + \setheadtopline{0pt} % 移除页眉顶部的横线(如果有) + \setheadsepline{0pt} + \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot*{$if(footer-center)$$footer-center$$else$$endif$} + \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \addtokomafont{pageheadfoot}{\upshape} +} + + +$if(isbook)$ +% \deftripstyle{ChapterStyle}{}{}{}{}{\pagemark}{} +% \renewcommand*{\chapterpagestyle}{ChapterStyle} +\renewcommand*{\chapterpagestyle}{eisvogel-chapterpage-header-footer} +$endif$ + + +$if(page-background)$ +\backgroundsetup{ +scale=1, +color=black, +opacity=$if(page-background-opacity)$$page-background-opacity$$else$0.2$endif$, +angle=0, +contents={% + \includegraphics[width=\paperwidth,height=\paperheight]{$page-background$} + }% +} +$endif$ +$endif$ +$endif$ + +% watermark +$if(watermark)$ +\usepackage{draftwatermark,xcolor} +\SetWatermarkText{\textcolor{$if(watermark-color)$$watermark-color$$else$gray!3$endif$}{$watermark$}} +\SetWatermarkScale{1.2} % 缩小水印尺寸(数值越小越密集) +\SetWatermarkAngle{45} % 斜角排列(经典水印样式) +\SetWatermarkLightness{0.99} % 亮度调节 +$endif$ + +%% +%% end added +%% + +\begin{document} + +%% +%% begin titlepage +%% +$if(beamer)$ +$else$ +$if(titlepage)$ +\begin{titlepage} +$if(titlepage-background)$ +\newgeometry{top=2cm, right=4cm, bottom=3cm, left=4cm} +$else$ +\newgeometry{left=2cm} +$endif$ +$if(titlepage-color)$ +\definecolor{titlepage-color}{HTML}{$titlepage-color$} +\newpagecolor{titlepage-color}\afterpage{\restorepagecolor} +$endif$ +$if(titlepage-background)$ +\tikz[remember picture,overlay] \node[inner sep=0pt] at (current page.center){\includegraphics[width=\paperwidth,height=\paperheight]{$titlepage-background$}}; +$endif$ +\newcommand{\colorRule}[3][black]{\textcolor[HTML]{#1}{\rule{#2}{#3}}} + +\NewDocumentEnvironment{dynalign}{} + {\begin{$if(titlepage-halign)$$titlepage-halign$$else$center$endif$}} + {\end{$if(titlepage-halign)$$titlepage-halign$$else$center$endif$}} + +\begin{dynalign} +\noindent +\\[-1em] +\color[HTML]{$if(titlepage-text-color)$$titlepage-text-color$$else$5F5F5F$endif$} +\makebox[0pt][l]{\colorRule[$if(titlepage-rule-color)$$titlepage-rule-color$$else$435488$endif$]{1.3\textwidth}{$if(titlepage-rule-height)$$titlepage-rule-height$$else$4$endif$pt}} +\par +\noindent + +$if(titlepage-logo)$ +\noindent +\vskip $if(logo-vskip)$$logo-vskip$$else$-8em$endif$ +\hskip $if(logo-hskip)$$logo-hskip$$else$-6em$endif$ +\includegraphics[width=$if(logo-width)$$logo-width$$else$35mm$endif$, left]{$titlepage-logo$} +$endif$ + +$if(titlepage-background)$ +% The titlepage with a background image has other text spacing and text size +{ + \setstretch{2} + \vfill + \vskip -8em + $if(title-vskip)$ + \vskip $title-vskip$ + $endif$ + $if(title-hskip)$ + \vskip $title-hskip$ + $endif$ + \noindent { + $if(title-size)$ + \$title-size$ + $else$ + \huge + $endif$ +\textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + { + $if(subtitle-size)$ + \$subtitle-size$ + $else$ + \Large + $endif$ + \textsf{$subtitle$}} + $endif$ + \vskip 2em + $if(author-vskip)$ + \vskip $author-vskip$ + $endif$ + \noindent { + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ + +\textsf{$for(author)$$author$$sep$, $endfor$} +\vskip 0.6em + $if(date-vskip)$ + \vskip $date-vskip$ + $endif$ +{\textsf{$if(institute)$$institute$\vskip 0.6em$endif$$date$}} +} + \vfill +} +$else$ +{ + \setstretch{1.4} + \vfill + \vskip 8em + $if(title-vskip)$ + \vskip $title-vskip$ + $endif$ + $if(title-hskip)$ + \vskip $title-hskip$ + $endif$ + \noindent {\huge \textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + {\Large \textsf{$subtitle$}} + $endif$ + \vskip 4em + $if(author-vskip)$ + \vskip $author-vskip$ + $endif$ + \noindent { + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ + +\textsf{$for(author)$$author$$sep$, $endfor$} +\vskip 0.6em + $if(date-vskip)$ + \vskip $date-vskip$ + $endif$ +} + \vfill +} +$endif$ + + +$if(titlepage-background)$ +$else$ + + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ +{\textsf{$if(institute)$$institute$\vskip 0.6em$endif$$date$}} +$endif$ +\end{dynalign} +\end{titlepage} +\restoregeometry +\pagenumbering{arabic} +$endif$ +$endif$ + + + +%% +%% end titlepage +%% + +$if(has-frontmatter)$ +\frontmatter +$endif$ +$if(title)$ +$if(beamer)$ +\frame{\titlepage} +% don't generate the default title +% $else$ +% \maketitle +$endif$ +$if(abstract)$ +\begin{abstract} +$abstract$ +\end{abstract} +$endif$ +$endif$ + +$if(first-chapter)$ +\setcounter{chapter}{$first-chapter$} +\addtocounter{chapter}{-1} +$endif$ + +$for(include-before)$ +$include-before$ + +$endfor$ +$if(toc)$ +$if(toc-title)$ +\renewcommand*\contentsname{$toc-title$} +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks] +$if(toc-title)$ + \frametitle{$toc-title$} +$endif$ + \setcounter{tocdepth}{$toc-depth$} + \tableofcontents +\end{frame} +$if(toc-own-page)$ +\newpage +$endif$ +$else$ +{ +$if(colorlinks)$ +\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$} +$endif$ +\setcounter{tocdepth}{$toc-depth$} +\tableofcontents +$if(toc-own-page)$ +\newpage +$endif$ +} +$endif$ +$endif$ +$if(lof)$ +\listoffigures +$endif$ +$if(lot)$ +\listoftables +$endif$ +$if(linestretch)$ +\setstretch{$linestretch$} +$endif$ +$if(has-frontmatter)$ +\mainmatter +$endif$ +$body$ + +$if(has-frontmatter)$ +\backmatter +$endif$ +$if(natbib)$ +$if(bibliography)$ +$if(biblio-title)$ +$if(has-chapters)$ +\renewcommand\bibname{$biblio-title$} +$else$ +\renewcommand\refname{$biblio-title$} +$endif$ +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue +$endif$ + \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} +$if(beamer)$ +\end{frame} +$endif$ + +$endif$ +$endif$ +$if(biblatex)$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue + \printbibliography[heading=none] +\end{frame} +$else$ +\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ +$endif$ + +$endif$ +$for(include-after)$ +$include-after$ + +$endfor$ +\end{document} diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/CL.docx b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/CL.docx new file mode 100755 index 0000000..3727b07 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/CL.docx differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/MS.docx b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/MS.docx new file mode 100755 index 0000000..5b9ad12 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/MS.docx differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/RN.docx b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/RN.docx new file mode 100755 index 0000000..a74403c Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/RN.docx differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/RP.docx b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/RP.docx new file mode 100755 index 0000000..18580b1 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/RP.docx differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/american-chemical-society.csl b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/american-chemical-society.csl new file mode 100755 index 0000000..01f8c49 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/american-chemical-society.csl @@ -0,0 +1,280 @@ + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/china-national-standard-gb-t-7714-2015-numeric.csl b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/china-national-standard-gb-t-7714-2015-numeric.csl new file mode 100755 index 0000000..f7c84f0 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/china-national-standard-gb-t-7714-2015-numeric.csl @@ -0,0 +1,435 @@ + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover1.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover1.pdf new file mode 100644 index 0000000..9111c08 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover1.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover2.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover2.pdf new file mode 100644 index 0000000..7b8b2a1 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover2.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover3.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover3.pdf new file mode 100644 index 0000000..4bc55bf Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover3.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover4.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover4.pdf new file mode 100644 index 0000000..2eaf27f Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/cover4.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/covers.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/covers.pdf new file mode 100644 index 0000000..845d1f0 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/covers.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/covers.pptx b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/covers.pptx new file mode 100644 index 0000000..0bcbfab Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/covers.pptx differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-gray1.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-gray1.pdf new file mode 100644 index 0000000..7fa9b94 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-gray1.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-gray1.svg b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-gray1.svg new file mode 100644 index 0000000..68a8fc9 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-gray1.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green0.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green0.pdf new file mode 100644 index 0000000..88b7fda Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green0.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green0.svg b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green0.svg new file mode 100644 index 0000000..00fe227 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green0.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green1.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green1.pdf new file mode 100644 index 0000000..091548e Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green1.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green1.svg b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green1.svg new file mode 100644 index 0000000..b6990aa --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-green1.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-greenline0.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-greenline0.pdf new file mode 100644 index 0000000..86786fa Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-greenline0.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-greenline0.svg b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-greenline0.svg new file mode 100644 index 0000000..7eec8c8 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-greenline0.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-white0.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-white0.pdf new file mode 100644 index 0000000..ca69ef8 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-white0.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-white0.svg b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-white0.svg new file mode 100644 index 0000000..0a12a38 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater-white0.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater.css b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater.css new file mode 100755 index 0000000..0bbdcff --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/drwater.css @@ -0,0 +1,109 @@ +.udot { + text-decoration-line: underline; + text-decoration-color: rgb(50, 50, 50); + text-decoration-style: dashed; + text-decoration-thickness: 1px; +} + +.good { + background-color: forestgreen; + color: lightyellow; +} + +.bad { + background-color: orangered; + color: lightyellow; +} + +.del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.5px; +} + + +.todo { + background-color: darkorange; + color: lightyellow; +} + +.com { + background-color: #0025ff; + font-weight: bold; + color: lightyellow; +} + +.add { + text-decoration-line: underline; + text-decoration-color: rgb(222 13 13); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + + +del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.0px; +} + + +ins { + text-decoration-color: rgb(222 93 93); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + +.clab { + background-color: rgb(255, 245, 240); +} + +.rem { + background-color: darkorange; + color: lightyellow; + text-decoration-thickness: 2px; +} + + +#criticnav { + position: fixed; + z-index: 1100; + top: 0; + right: 0; + width: 120px; + border-bottom: solid 1px #ffffff; + margin: 0; + padding: 10; + background-color: rgb(143 38 38 / 95%); + color: #ffffff; + font-size: 12px; + font-family: "Helvetica Neue", helvetica, arial, sans-serif !important +} + +#criticnav ul { + list-style-type: none; + width: 90%; + margin: 0 auto; + padding: 0 +} + +#criticnav ul li { + display: block; + width: 100px; + min-width: 80px; + text-align: center; + padding: 5px 0 3px !important; + margin: 5px 2px !important; + line-height: 1em; + float: center; + text-transform: uppercase; + cursor: pointer; + border-radius: 20px; + border: 3px solid rgba(255,255,255,0); + color: #fff !important +} + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/dweisvogel.tex b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/dweisvogel.tex new file mode 100644 index 0000000..50b9664 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/dweisvogel.tex @@ -0,0 +1,1323 @@ +%% +% Copyright (c) 2017 - 2024, Pascal Wagler; +% Copyright (c) 2014 - 2024, John MacFarlane +% +% All rights reserved. +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions +% are met: +% +% - Redistributions of source code must retain the above copyright +% notice, this list of conditions and the following disclaimer. +% +% - Redistributions in binary form must reproduce the above copyright +% notice, this list of conditions and the following disclaimer in the +% documentation and/or other materials provided with the distribution. +% +% - Neither the name of John MacFarlane nor the names of other +% contributors may be used to endorse or promote products derived +% from this software without specific prior written permission. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +% "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +% FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +% COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +% INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +% LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +% ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE. +%% + +%% +% This is the Eisvogel pandoc LaTeX template. +% +% For usage information and examples visit the official GitHub page: +% https://github.com/Wandmalfarbe/pandoc-latex-template +%% + +% Options for packages loaded elsewhere +\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref} +\PassOptionsToPackage{hyphens}{url} +\PassOptionsToPackage{dvipsnames,svgnames,x11names,table}{xcolor} +$if(CJKmainfont)$ +\PassOptionsToPackage{space}{xeCJK} +$endif$ +% +\documentclass[ +$if(fontsize)$ + $fontsize$, +$endif$ +$if(papersize)$ + $papersize$paper, +$else$ + paper=a4, +$endif$ +$if(beamer)$ + ignorenonframetext, +$if(handout)$ + handout, +$endif$ +$if(aspectratio)$ + aspectratio=$aspectratio$, +$endif$ +$if(babel-lang)$ + $babel-lang$, +$endif$ +$endif$ +$for(classoption)$ + $classoption$$sep$, +$endfor$ + ,captions=tableheading +]{$if(beamer)$$documentclass$$else$$if(isbook)$scrbook$else$scrartcl$endif$$endif$} +$if(beamer)$ +$if(background-image)$ +\usebackgroundtemplate{% + \includegraphics[width=\paperwidth]{$background-image$}% +} +% In beamer background-image does not work well when other images are used, so this is the workaround +\pgfdeclareimage[width=\paperwidth,height=\paperheight]{background}{$background-image$} +\usebackgroundtemplate{\pgfuseimage{background}} +$endif$ + +\usepackage{pgfpages} +\setbeamertemplate{caption}[numbered] +\setbeamertemplate{caption label separator}{: } +\setbeamercolor{caption name}{fg=normal text.fg} +\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$ +$for(beameroption)$ +\setbeameroption{$beameroption$} +$endfor$ +% Prevent slide breaks in the middle of a paragraph +\widowpenalties 1 10000 +\raggedbottom +$if(section-titles)$ +\setbeamertemplate{part page}{ + \centering + \begin{beamercolorbox}[sep=16pt,center]{part title} + \usebeamerfont{part title}\insertpart\par + \end{beamercolorbox} +} +\setbeamertemplate{section page}{ + \centering + \begin{beamercolorbox}[sep=12pt,center]{section title} + \usebeamerfont{section title}\insertsection\par + \end{beamercolorbox} +} +\setbeamertemplate{subsection page}{ + \centering + \begin{beamercolorbox}[sep=8pt,center]{subsection title} + \usebeamerfont{subsection title}\insertsubsection\par + \end{beamercolorbox} +} +\AtBeginPart{ + \frame{\partpage} +} +\AtBeginSection{ + \ifbibliography + \else + \frame{\sectionpage} + \fi +} +\AtBeginSubsection{ + \frame{\subsectionpage} +} +$endif$ +$endif$ +$if(beamerarticle)$ +\usepackage{beamerarticle} % needs to be loaded first +$endif$ +\usepackage{amsmath,amssymb} +$if(linestretch)$ +\usepackage{setspace} +$else$ +% Use setspace anyway because we change the default line spacing. +% The spacing is changed early to affect the titlepage and the TOC. +\usepackage{setspace} +\setstretch{1.2} +$endif$ +\usepackage{iftex} +\ifPDFTeX + \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provide euro and other symbols +\else % if luatex or xetex +$if(mathspec)$ + \ifXeTeX + \usepackage{mathspec} % this also loads fontspec + \else + \usepackage{unicode-math} % this also loads fontspec + \fi +$else$ + \usepackage{unicode-math} % this also loads fontspec +$endif$ + \defaultfontfeatures{Scale=MatchLowercase}$-- must come before Beamer theme + \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} +\fi +$if(fontfamily)$ +$else$ +$-- Set default font before Beamer theme so the theme can override it +\usepackage{lmodern} +$endif$ +$-- Set Beamer theme before user font settings so they can override theme +$if(beamer)$ +$if(theme)$ +\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$} +$endif$ +$if(colortheme)$ +\usecolortheme{$colortheme$} +$endif$ +$if(fonttheme)$ +\usefonttheme{$fonttheme$} +$endif$ +$if(mainfont)$ +\usefonttheme{serif} % use mainfont rather than sansfont for slide text +$endif$ +$if(innertheme)$ +\useinnertheme{$innertheme$} +$endif$ +$if(outertheme)$ +\useoutertheme{$outertheme$} +$endif$ +$endif$ +$-- User font settings (must come after default font and Beamer theme) +$if(fontfamily)$ +\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} +$endif$ +\ifPDFTeX\else + % xetex/luatex font selection +$if(mainfont)$ + $if(mainfontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("mainfontfallback",{ + $for(mainfontfallback)$"$mainfontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$} +$endif$ +$if(sansfont)$ + $if(sansfontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("sansfontfallback",{ + $for(sansfontfallback)$"$sansfontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$$if(sansfontfallback)$,RawFeature={fallback=sansfontfallback}$endif$]{$sansfont$} +$endif$ +$if(monofont)$ + $if(monofontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("monofontfallback",{ + $for(monofontfallback)$"$monofontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$if(monofontfallback)$,RawFeature={fallback=monofontfallback}$endif$]{$monofont$} +$endif$ +$for(fontfamilies)$ + \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$} +$endfor$ +$if(mathfont)$ +$if(mathspec)$ + \ifXeTeX + \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \else + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \fi +$else$ + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} +$endif$ +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + \usepackage{xeCJK} + \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + $if(CJKsansfont)$ + \setCJKsansfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKsansfont$} + $endif$ + $if(CJKmonofont)$ + \setCJKmonofont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmonofont$} + $endif$ + \fi +$endif$ +$if(luatexjapresetoptions)$ + \ifLuaTeX + \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset} + \fi +$endif$ +$if(CJKmainfont)$ + \ifLuaTeX + \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec} + \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +\fi +$if(zero-width-non-joiner)$ +%% Support for zero-width non-joiner characters. +\makeatletter +\def\zerowidthnonjoiner{% + % Prevent ligatures and adjust kerning, but still support hyphenating. + \texorpdfstring{% + \TextOrMath{\nobreak\discretionary{-}{}{\kern.03em}% + \ifvmode\else\nobreak\hskip\z@skip\fi}{}% + }{}% +} +\makeatother +\ifPDFTeX + \DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner} +\else + \catcode`^^^^200c=\active + \protected\def ^^^^200c{\zerowidthnonjoiner} +\fi +%% End of ZWNJ support +$endif$ +% Use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\IfFileExists{microtype.sty}{% use microtype if available + \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype} + \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +$if(indent)$ +$else$ +\makeatletter +\@ifundefined{KOMAClassName}{% if non-KOMA class + \IfFileExists{parskip.sty}{% + \usepackage{parskip} + }{% else + \setlength{\parindent}{0pt} + \setlength{\parskip}{6pt plus 2pt minus 1pt}} +}{% if KOMA class + \KOMAoptions{parskip=half}} +\makeatother +$endif$ +$if(verbatim-in-note)$ +\usepackage{fancyvrb} +$endif$ +\usepackage{xcolor} +\definecolor{default-linkcolor}{HTML}{A50000} +\definecolor{default-filecolor}{HTML}{A50000} +\definecolor{default-citecolor}{HTML}{4077C0} +\definecolor{default-urlcolor}{HTML}{4077C0} +$if(footnotes-pretty)$ +% load footmisc in order to customize footnotes (footmisc has to be loaded before hyperref, cf. https://tex.stackexchange.com/a/169124/144087) +\usepackage[hang,flushmargin,bottom,multiple]{footmisc} +\setlength{\footnotemargin}{0.8em} % set space between footnote nr and text +\setlength{\footnotesep}{\baselineskip} % set space between multiple footnotes +\setlength{\skip\footins}{0.3cm} % set space between page content and footnote +\setlength{\footskip}{0.9cm} % set space between footnote and page bottom +$endif$ +$if(geometry)$ +$if(beamer)$ +\geometry{$for(geometry)$$geometry$$sep$,$endfor$} +$else$ +\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$else$ +$if(beamer)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering,$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$endif$ +$if(titlepage-logo)$ +\usepackage[export]{adjustbox} +\usepackage{graphicx} +$endif$ +$if(beamer)$ +\newif\ifbibliography +$endif$ +$if(listings)$ +\usepackage{listings} +\newcommand{\passthrough}[1]{#1} +\lstset{defaultdialect=[5.3]Lua} +\lstset{defaultdialect=[x86masm]Assembler} +$endif$ +$if(listings-no-page-break)$ +\usepackage{etoolbox} +\BeforeBeginEnvironment{lstlisting}{\par\noindent\begin{minipage}{\linewidth}} +\AfterEndEnvironment{lstlisting}{\end{minipage}\par\addvspace{\topskip}} +$endif$ +$if(lhs)$ +\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} +$endif$ +$if(highlighting-macros)$ +$highlighting-macros$ + +% Workaround/bugfix from jannick0. +% See https://github.com/jgm/pandoc/issues/4302#issuecomment-360669013) +% or https://github.com/Wandmalfarbe/pandoc-latex-template/issues/2 +% +% Redefine the verbatim environment 'Highlighting' to break long lines (with +% the help of fvextra). Redefinition is necessary because it is unlikely that +% pandoc includes fvextra in the default template. +\usepackage{fvextra} +\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,fontsize=$if(code-block-font-size)$$code-block-font-size$$else$\small$endif$,commandchars=\\\{\}} + +$endif$ + +% 为中文添加支持 by Ming Su +$if(CJK)$ +$if(isbook)$ +\usepackage{ctex} %调用中文字体宏包 +\usepackage{indentfirst} %调用首行缩进宏包 +\usepackage{ctex} % 确保中文字体支持 +\usepackage{zhnumber} +% 修改 chapter 格式为 "第X章" +% \renewcommand{\chapterformat}{第~\thechapter~章} +% \renewcommand{\chapterformat}{第\zhnumber{\thechapter}章} +\renewcommand{\chaptermarkformat}{第~\zhnumber{\thechapter}~章} +\renewcommand{\chapterformat}{第\zhnumber{\thechapter}章} +\renewcommand*{\chapterlinesformat}[3]{% + \parbox{\linewidth}{\centering #2~\quad~#3} % 居中 + "·" 分隔 + % 或改用冒号分隔: + % \parbox{\linewidth}{\centering #2:#3} +} +\RedeclareSectionCommand[ + beforeskip=1.5em plus 0.5em minus 0.5em, + afterskip=1em plus 0.2em, + font=\large\bfseries +]{section} +\usepackage{zhnumber} % 确保已加载(或直接用 ctex) +% 修改目录中的章节编号为中文 +\addtokomafont{chapterentry}{\normalfont} % 可选:调整目录字体 +\renewcommand*{\chapterformat}{第\zhnumber{\thechapter}章} % 正文标题格式 +\renewcommand*{\chaptermarkformat}{第\zhnumber{\thechapter}章\quad} % 页眉标题格式 +% 关键!覆盖目录中的章节编号 +\renewcommand{\addchaptertocentry}[2]{% + \addtocentrydefault{chapter}{第\zhnumber{#1}章}{#2}% +} +\RedeclareSectionCommand[ + tocentryindent=0pt, + tocentrynumwidth=3.5em % 确保编号区域足够宽 +]{chapter} +$endif$ +$endif$ + +$if(tables)$ +\usepackage{longtable,booktabs,array} +$if(multirow)$ +\usepackage{multirow} +$endif$ +\usepackage{calc} % for calculating minipage widths +$if(beamer)$ +\usepackage{caption} +% Make caption package work with longtable +\makeatletter +\def\fnum@table{\tablename~\thetable} +\makeatother +$else$ +% Correct order of tables after \paragraph or \subparagraph +\usepackage{etoolbox} +\makeatletter +\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} +\makeatother +% Allow footnotes in longtable head/foot +\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} +\makesavenoteenv{longtable} +$endif$ +$endif$ +% add backlinks to footnote references, cf. https://tex.stackexchange.com/questions/302266/make-footnote-clickable-both-ways +$if(footnotes-disable-backlinks)$ +$else$ +\usepackage{footnotebackref} +$endif$ +$if(graphics)$ +\usepackage{graphicx} +\makeatletter +% \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +% \def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +% \makeatother +% % Scale images if necessary, so that they will not overflow the page +% % margins by default, and it is still possible to overwrite the defaults +% % using explicit options in \includegraphics[width, height, ...]{} +% \setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +\newsavebox\pandoc@box +\newcommand*\pandocbounded[1]{% scales image to fit in text height/width + \sbox\pandoc@box{#1}% + \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% + \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% + \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both + \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% + \else\usebox{\pandoc@box}% + \fi% +} +% Set default figure placement to htbp +\makeatletter +\def\fps@figure{htbp} +\makeatother +% \makeatletter Old options from template, replaced with quarto defaults above +% \newsavebox\pandoc@box +% \newcommand*\pandocbounded[1]{% scales image to fit in text height/width +% \sbox\pandoc@box{#1}% +% \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% +% \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% +% \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both +% \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% +% \else\usebox{\pandoc@box}% +% \fi% +% } +% % Set default figure placement to htbp +% % Make use of float-package and set default placement for figures to H. +% % The option H means 'PUT IT HERE' (as opposed to the standard h option which means 'You may put it here if you like'). +% \usepackage{float} +% \floatplacement{figure}{$if(float-placement-figure)$$float-placement-figure$$else$H$endif$} +% \makeatother +$endif$ +$if(svg)$ +\usepackage{svg} +$endif$ +$if(strikeout)$ +$-- also used for underline +\ifLuaTeX + \usepackage{luacolor} + \usepackage[soul]{lua-ul} +\else +\usepackage{soul} +$if(beamer)$ + \makeatletter + \let\HL\hl + \renewcommand\hl{% fix for beamer highlighting + \let\set@color\beamerorig@set@color + \let\reset@color\beamerorig@reset@color + \HL} + \makeatother +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + % soul's \st doesn't work for CJK: + \usepackage{xeCJKfntef} + \renewcommand{\st}[1]{\sout{#1}} + \fi +$endif$ +\fi +$endif$ +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +$if(numbersections)$ +\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$} +$else$ +\setcounter{secnumdepth}{-\maxdimen} % remove section numbering +$endif$ +$if(subfigure)$ +\usepackage{subcaption} +$endif$ +$if(beamer)$ +$else$ +$if(block-headings)$ +% Make \paragraph and \subparagraph free-standing +\makeatletter +\ifx\paragraph\undefined\else + \let\oldparagraph\paragraph + \renewcommand{\paragraph}{ + \@ifstar + \xxxParagraphStar + \xxxParagraphNoStar + } + \newcommand{\xxxParagraphStar}[1]{\oldparagraph*{#1}\mbox{}} + \newcommand{\xxxParagraphNoStar}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else + \let\oldsubparagraph\subparagraph + \renewcommand{\subparagraph}{ + \@ifstar + \xxxSubParagraphStar + \xxxSubParagraphNoStar + } + \newcommand{\xxxSubParagraphStar}[1]{\oldsubparagraph*{#1}\mbox{}} + \newcommand{\xxxSubParagraphNoStar}[1]{\oldsubparagraph{#1}\mbox{}} +\fi +\makeatother +$endif$ +$endif$ +$if(pagestyle)$ +\pagestyle{$pagestyle$} +$endif$ +$if(csl-refs)$ +% definitions for citeproc citations +\NewDocumentCommand\citeproctext{}{} +\NewDocumentCommand\citeproc{mm}{% + \begingroup\def\citeproctext{#2}\cite{#1}\endgroup} +\makeatletter + % allow citations to break across lines + \let\@cite@ofmt\@firstofone + % avoid brackets around text for \cite: + \def\@biblabel#1{} + \def\@cite#1#2{{#1\if@tempswa , #2\fi}} +\makeatother +\newlength{\cslhangindent} +\setlength{\cslhangindent}{1.5em} +\newlength{\csllabelwidth} +\setlength{\csllabelwidth}{3em} +\newenvironment{CSLReferences}[2] % #1 hanging-indent, #2 entry-spacing + {\begin{list}{}{% + \setlength{\itemindent}{0pt} + \setlength{\leftmargin}{0pt} + \setlength{\parsep}{0pt} + % turn on hanging indent if param 1 is 1 + \ifodd #1 + \setlength{\leftmargin}{\cslhangindent} + \setlength{\itemindent}{-1\cslhangindent} + \fi + % set entry spacing + \setlength{\itemsep}{#2\baselineskip}}} + {\end{list}} +\usepackage{calc} +\newcommand{\CSLBlock}[1]{\hfill\break\parbox[t]{\linewidth}{\strut\ignorespaces#1\strut}} +\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{\strut#1\strut}} +\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{\strut#1\strut}} +\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1} +$endif$ +$if(lang)$ +\ifLuaTeX +\usepackage[bidi=basic]{babel} +\else +\usepackage[bidi=default]{babel} +\fi +$if(babel-lang)$ +\babelprovide[main,import]{$babel-lang$} +$if(mainfont)$ +\ifPDFTeX +\else +\babelfont{rm}[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$} +\fi +$endif$ +$endif$ +$for(babel-otherlangs)$ +\babelprovide[import]{$babel-otherlangs$} +$endfor$ +$for(babelfonts/pairs)$ +\babelfont[$babelfonts.key$]{rm}{$babelfonts.value$} +$endfor$ +% get rid of language-specific shorthands (see #6817): +\let\LanguageShortHands\languageshorthands +\def\languageshorthands#1{} +$if(selnolig-langs)$ +\ifLuaTeX + \usepackage[$for(selnolig-langs)$$it$$sep$,$endfor$]{selnolig} % disable illegal ligatures +\fi +$endif$ +$endif$ +$for(header-includes)$ +$header-includes$ +$endfor$ +$if(dir)$ +\ifPDFTeX + \TeXXeTstate=1 + \newcommand{\RL}[1]{\beginR #1\endR} + \newcommand{\LR}[1]{\beginL #1\endL} + \newenvironment{RTL}{\beginR}{\endR} + \newenvironment{LTR}{\beginL}{\endL} +\fi +$endif$ +$if(natbib)$ +\usepackage[$natbiboptions$]{natbib} +\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} +$endif$ +$if(biblatex)$ +\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} +$for(bibliography)$ +\addbibresource{$bibliography$} +$endfor$ +$endif$ +$if(nocite-ids)$ +\nocite{$for(nocite-ids)$$it$$sep$, $endfor$} +$endif$ +$if(csquotes)$ +\usepackage{csquotes} +$endif$ +\usepackage{bookmark} +\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available +\urlstyle{$if(urlstyle)$$urlstyle$$else$same$endif$} +$if(links-as-notes)$ +% Make links footnotes instead of hotlinks: +\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}} +$endif$ +$if(verbatim-in-note)$ +\VerbatimFootnotes % allow verbatim text in footnotes +$endif$ +\hypersetup{ +$if(title-meta)$ + pdftitle={$title-meta$}, +$endif$ +$if(author-meta)$ + pdfauthor={$author-meta$}, +$endif$ +$if(lang)$ + pdflang={$lang$}, +$endif$ +$if(subject)$ +pdfsubject={$subject$}, +$endif$ +$if(keywords)$ + pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$}, +$endif$ +$if(colorlinks)$ + colorlinks=true, + linkcolor={$if(linkcolor)$$linkcolor$$else$default-linkcolor$endif$}, + filecolor={$if(filecolor)$$filecolor$$else$default-filecolor$endif$}, + citecolor={$if(citecolor)$$citecolor$$else$default-citecolor$endif$}, + urlcolor={$if(urlcolor)$$urlcolor$$else$default-urlcolor$endif$}, +$else$ +$if(boxlinks)$ +$else$ + hidelinks, +$endif$ +$endif$ + breaklinks=true, + pdfcreator={LaTeX via pandoc with the Eisvogel template}} +$if(title)$ +\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} +$endif$ +$if(subtitle)$ +$if(beamer)$ +$else$ +\usepackage{etoolbox} +\makeatletter +\providecommand{\subtitle}[1]{% add subtitle to \maketitle + \apptocmd{\@title}{\par {\large #1 \par}}{}{} +} +\makeatother +$endif$ +\subtitle{$subtitle$} +$endif$ +\author{$for(author)$$author$$sep$ \and $endfor$} +\date{$date$} +$if(beamer)$ +$if(institute)$ +\institute{$for(institute)$$institute$$sep$ \and $endfor$} +$endif$ +$if(titlegraphic)$ +\titlegraphic{\includegraphics$if(titlegraphicoptions)$[$for(titlegraphicoptions)$$titlegraphicoptions$$sep$, $endfor$]$endif${$titlegraphic$}} +$endif$ +$if(logo)$ +\logo{\includegraphics{$logo$}} +$endif$ +$endif$ + + + +%% +%% added +%% + +$if(page-background)$ +\usepackage[pages=all]{background} +$endif$ + +% +% for the background color of the title page +% +$if(titlepage)$ +\usepackage{pagecolor} +\usepackage{afterpage} +$if(titlepage-background)$ +\usepackage{tikz} +$endif$ +$if(geometry)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering]{geometry} +$endif$ +$endif$ + +% +% break urls +% +\PassOptionsToPackage{hyphens}{url} + +% +% When using babel or polyglossia with biblatex, loading csquotes is recommended +% to ensure that quoted texts are typeset according to the rules of your main language. +% +\usepackage{csquotes} + +% +% captions +% +\definecolor{caption-color}{HTML}{777777} +$if(beamer)$ +$else$ +\usepackage[font={stretch=1.2}, textfont={color=caption-color}, position=top, skip=4mm, labelfont=bf, singlelinecheck=false, justification=$if(caption-justification)$$caption-justification$$else$raggedright$endif$]{caption} +\setcapindent{0em} +$endif$ + +% +% blockquote +% +\definecolor{blockquote-border}{RGB}{221,221,221} +\definecolor{blockquote-text}{RGB}{119,119,119} +\usepackage{mdframed} +\newmdenv[rightline=false,bottomline=false,topline=false,linewidth=3pt,linecolor=blockquote-border,skipabove=\parskip]{customblockquote} +\renewenvironment{quote}{\begin{customblockquote}\list{}{\rightmargin=0em\leftmargin=0em}% +\item\relax\color{blockquote-text}\ignorespaces}{\unskip\unskip\endlist\end{customblockquote}} + +% +% Source Sans Pro as the default font family +% Source Code Pro for monospace text +% +% 'default' option sets the default +% font family to Source Sans Pro, not \sfdefault. +% +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + $if(fontfamily)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + $endif$ +\else % if not pdftex + $if(mainfont)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + + % XeLaTeX specific adjustments for straight quotes: https://tex.stackexchange.com/a/354887 + % This issue is already fixed (see https://github.com/silkeh/latex-sourcecodepro/pull/5) but the + % fix is still unreleased. + % TODO: Remove this workaround when the new version of sourcecodepro is released on CTAN. + \ifxetex + \makeatletter + \defaultfontfeatures[\ttfamily] + { Numbers = \sourcecodepro@figurestyle, + Scale = \SourceCodePro@scale, + Extension = .otf } + \setmonofont + [ UprightFont = *-\sourcecodepro@regstyle, + ItalicFont = *-\sourcecodepro@regstyle It, + BoldFont = *-\sourcecodepro@boldstyle, + BoldItalicFont = *-\sourcecodepro@boldstyle It ] + {SourceCodePro} + \makeatother + \fi + $endif$ +\fi + + +% setup for chinese font, by Ming +\setCJKmainfont{$CJKmainfont$}[BoldFont=$CJKboldfont$, ItalicFont=$CJKitalicfont$] + +% +% heading color +% +\definecolor{heading-color}{RGB}{40,40,40} +$if(beamer)$ +$else$ +\addtokomafont{section}{\color{heading-color}} +$endif$ +% When using the classes report, scrreprt, book, +% scrbook or memoir, uncomment the following line. +%\addtokomafont{chapter}{\color{heading-color}} + +% +% variables for title, author and date +% +$if(beamer)$ +$else$ +\usepackage{titling} +\title{$title$} +\author{$for(author)$$author$$sep$, $endfor$} +\date{$date$} +$endif$ + +% +% tables +% +$if(tables)$ + +\definecolor{table-row-color}{HTML}{F5F5F5} +\definecolor{table-rule-color}{HTML}{999999} + +%\arrayrulecolor{black!40} +\arrayrulecolor{table-rule-color} % color of \toprule, \midrule, \bottomrule +\setlength\heavyrulewidth{0.3ex} % thickness of \toprule, \bottomrule +\renewcommand{\arraystretch}{1.3} % spacing (padding) + +$if(table-use-row-colors)$ +% Unfortunately the colored cells extend beyond the edge of the +% table because pandoc uses @-expressions (@{}) like so: +% +% \begin{longtable}[]{@{}ll@{}} +% \end{longtable} +% +% https://en.wikibooks.org/wiki/LaTeX/Tables#.40-expressions +\usepackage{etoolbox} +\AtBeginEnvironment{longtable}{\rowcolors{2}{}{table-row-color!100}} +\preto{\toprule}{\hiderowcolors}{}{} +\appto{\endhead}{\showrowcolors}{}{} +\appto{\endfirsthead}{\showrowcolors}{}{} +$endif$ +$endif$ + +% +% remove paragraph indentation +% +% \setlength{\parindent}{0pt} +$if(parindent)$ +\setlength{\parindent}{2em} %设置首行缩进为2字符 +$else$ +\setlength{\parindent}{0pt} +$endif$ +\setlength{\parskip}{6pt plus 2pt minus 1pt} +\setlength{\emergencystretch}{3em} % prevent overfull lines + + + +% +% +% Listings +% +% + +$if(listings)$ + +% +% general listing colors +% +\definecolor{listing-background}{HTML}{F7F7F7} +\definecolor{listing-rule}{HTML}{B3B2B3} +\definecolor{listing-numbers}{HTML}{B3B2B3} +\definecolor{listing-text-color}{HTML}{000000} +\definecolor{listing-keyword}{HTML}{435489} +\definecolor{listing-keyword-2}{HTML}{1284CA} % additional keywords +\definecolor{listing-keyword-3}{HTML}{9137CB} % additional keywords +\definecolor{listing-identifier}{HTML}{435489} +\definecolor{listing-string}{HTML}{00999A} +\definecolor{listing-comment}{HTML}{8E8E8E} + +\lstdefinestyle{eisvogel_listing_style}{ + language = java, +$if(listings-disable-line-numbers)$ + xleftmargin = 0.6em, + framexleftmargin = 0.4em, +$else$ + numbers = left, + xleftmargin = 2.7em, + framexleftmargin = 2.5em, +$endif$ + backgroundcolor = \color{listing-background}, + basicstyle = \color{listing-text-color}\linespread{1.0}% + \lst@ifdisplaystyle% + $if(code-block-font-size)$$code-block-font-size$$else$\small$endif$% + \fi\ttfamily{}, + breaklines = true, + frame = single, + framesep = 0.19em, + rulecolor = \color{listing-rule}, + frameround = ffff, + tabsize = 4, + numberstyle = \color{listing-numbers}, + aboveskip = 1.0em, + belowskip = 0.1em, + abovecaptionskip = 0em, + belowcaptionskip = 1.0em, + keywordstyle = {\color{listing-keyword}\bfseries}, + keywordstyle = {[2]\color{listing-keyword-2}\bfseries}, + keywordstyle = {[3]\color{listing-keyword-3}\bfseries\itshape}, + sensitive = true, + identifierstyle = \color{listing-identifier}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + showstringspaces = false, + escapeinside = {/*@}{@*/}, % Allow LaTeX inside these special comments + literate = + {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 + {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 + {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 + {À}{{\`A}}1 {È}{{\`E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 + {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1 + {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1 + {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1 + {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1 + {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1 + {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1 + {€}{{\EUR}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1 + {»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1 + {…}{{\ldots}}1 {≥}{{>=}}1 {≤}{{<=}}1 {„}{{\glqq}}1 {“}{{\grqq}}1 + {”}{{''}}1 +} +\lstset{style=eisvogel_listing_style} + +% +% Java (Java SE 12, 2019-06-22) +% +\lstdefinelanguage{Java}{ + morekeywords={ + % normal keywords (without data types) + abstract,assert,break,case,catch,class,continue,default, + do,else,enum,exports,extends,final,finally,for,if,implements, + import,instanceof,interface,module,native,new,package,private, + protected,public,requires,return,static,strictfp,super,switch, + synchronized,this,throw,throws,transient,try,volatile,while, + % var is an identifier + var + }, + morekeywords={[2] % data types + % primitive data types + boolean,byte,char,double,float,int,long,short, + % String + String, + % primitive wrapper types + Boolean,Byte,Character,Double,Float,Integer,Long,Short + % number types + Number,AtomicInteger,AtomicLong,BigDecimal,BigInteger,DoubleAccumulator,DoubleAdder,LongAccumulator,LongAdder,Short, + % other + Object,Void,void + }, + morekeywords={[3] % literals + % reserved words for literal values + null,true,false, + }, + sensitive, + morecomment = [l]//, + morecomment = [s]{/*}{*/}, + morecomment = [s]{/**}{*/}, + morestring = [b]", + morestring = [b]', +} + +\lstdefinelanguage{XML}{ + morestring = [b]", + moredelim = [s][\bfseries\color{listing-keyword}]{<}{\ }, + moredelim = [s][\bfseries\color{listing-keyword}]{}, + moredelim = [l][\bfseries\color{listing-keyword}]{/>}, + moredelim = [l][\bfseries\color{listing-keyword}]{>}, + morecomment = [s]{}, + morecomment = [s]{}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + identifierstyle = \color{listing-identifier} +} +$endif$ + +% +% header and footer +% +$if(beamer)$ +$else$ +$if(disable-header-and-footer)$ +$else$ +\usepackage[headsepline,footsepline]{scrlayer-scrpage} + +\newpairofpagestyles{eisvogel-header-footer}{ + \clearpairofpagestyles + \ihead*{$if(header-left)$$header-left$$else$$title$$endif$} + \chead*{$if(header-center)$$header-center$$else$$endif$} + \ohead*{$if(header-right)$$header-right$$else$$date$$endif$} + \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot*{$if(footer-center)$$footer-center$$else$$endif$} + \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \addtokomafont{pageheadfoot}{\upshape} +} +\pagestyle{eisvogel-header-footer} + +\newpairofpagestyles{eisvogel-chapterpage-header-footer}{ + \clearpairofpagestyles + \setheadtopline{0pt} % 移除页眉顶部的横线(如果有) + \setheadsepline{0pt} + \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot*{$if(footer-center)$$footer-center$$else$$endif$} + \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \addtokomafont{pageheadfoot}{\upshape} +} + + +$if(isbook)$ +% \deftripstyle{ChapterStyle}{}{}{}{}{\pagemark}{} +% \renewcommand*{\chapterpagestyle}{ChapterStyle} +\renewcommand*{\chapterpagestyle}{eisvogel-chapterpage-header-footer} +$endif$ + + +$if(page-background)$ +\backgroundsetup{ +scale=1, +color=black, +opacity=$if(page-background-opacity)$$page-background-opacity$$else$0.2$endif$, +angle=0, +contents={% + \includegraphics[width=\paperwidth,height=\paperheight]{$page-background$} + }% +} +$endif$ +$endif$ +$endif$ + +% watermark +$if(watermark)$ +\usepackage{draftwatermark,xcolor} +\SetWatermarkText{\textcolor{$if(watermark-color)$$watermark-color$$else$gray!3$endif$}{$watermark$}} +\SetWatermarkScale{1.2} % 缩小水印尺寸(数值越小越密集) +\SetWatermarkAngle{45} % 斜角排列(经典水印样式) +\SetWatermarkLightness{0.99} % 亮度调节 +$endif$ + +%% +%% end added +%% + +\begin{document} + +%% +%% begin titlepage +%% +$if(beamer)$ +$else$ +$if(titlepage)$ +\begin{titlepage} +$if(titlepage-background)$ +\newgeometry{top=2cm, right=4cm, bottom=3cm, left=4cm} +$else$ +\newgeometry{left=2cm} +$endif$ +$if(titlepage-color)$ +\definecolor{titlepage-color}{HTML}{$titlepage-color$} +\newpagecolor{titlepage-color}\afterpage{\restorepagecolor} +$endif$ +$if(titlepage-background)$ +\tikz[remember picture,overlay] \node[inner sep=0pt] at (current page.center){\includegraphics[width=\paperwidth,height=\paperheight]{$titlepage-background$}}; +$endif$ +\newcommand{\colorRule}[3][black]{\textcolor[HTML]{#1}{\rule{#2}{#3}}} + +\NewDocumentEnvironment{dynalign}{} + {\begin{$if(titlepage-halign)$$titlepage-halign$$else$center$endif$}} + {\end{$if(titlepage-halign)$$titlepage-halign$$else$center$endif$}} + +\begin{dynalign} +\noindent +\\[-1em] +\color[HTML]{$if(titlepage-text-color)$$titlepage-text-color$$else$5F5F5F$endif$} +\makebox[0pt][l]{\colorRule[$if(titlepage-rule-color)$$titlepage-rule-color$$else$435488$endif$]{1.3\textwidth}{$if(titlepage-rule-height)$$titlepage-rule-height$$else$4$endif$pt}} +\par +\noindent + +$if(titlepage-logo)$ +\noindent +\vskip $if(logo-vskip)$$logo-vskip$$else$-8em$endif$ +\hskip $if(logo-hskip)$$logo-hskip$$else$-6em$endif$ +\includegraphics[width=$if(logo-width)$$logo-width$$else$35mm$endif$, left]{$titlepage-logo$} +$endif$ + +$if(titlepage-background)$ +% The titlepage with a background image has other text spacing and text size +{ + \setstretch{2} + \vfill + \vskip -8em + $if(title-vskip)$ + \vskip $title-vskip$ + $endif$ + $if(title-hskip)$ + \vskip $title-hskip$ + $endif$ + \noindent { + $if(title-size)$ + \$title-size$ + $else$ + \huge + $endif$ +\textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + { + $if(subtitle-size)$ + \$subtitle-size$ + $else$ + \Large + $endif$ + \textsf{$subtitle$}} + $endif$ + \vskip 2em + $if(author-vskip)$ + \vskip $author-vskip$ + $endif$ + \noindent { + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ + +\textsf{$for(author)$$author$$sep$, $endfor$} +\vskip 0.6em + $if(date-vskip)$ + \vskip $date-vskip$ + $endif$ +{\textsf{$if(institute)$$institute$\vskip 0.6em$endif$$date$}} +} + \vfill +} +$else$ +{ + \setstretch{1.4} + \vfill + \vskip 8em + $if(title-vskip)$ + \vskip $title-vskip$ + $endif$ + $if(title-hskip)$ + \vskip $title-hskip$ + $endif$ + \noindent {\huge \textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + {\Large \textsf{$subtitle$}} + $endif$ + \vskip 4em + $if(author-vskip)$ + \vskip $author-vskip$ + $endif$ + \noindent { + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ + +\textsf{$for(author)$$author$$sep$, $endfor$} +\vskip 0.6em + $if(date-vskip)$ + \vskip $date-vskip$ + $endif$ +} + \vfill +} +$endif$ + + +$if(titlepage-background)$ +$else$ + + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ +{\textsf{$if(institute)$$institute$\vskip 0.6em$endif$$date$}} +$endif$ +\end{dynalign} +\end{titlepage} +\restoregeometry +\pagenumbering{arabic} +$endif$ +$endif$ + + + +%% +%% end titlepage +%% + +$if(has-frontmatter)$ +\frontmatter +$endif$ +$if(title)$ +$if(beamer)$ +\frame{\titlepage} +% don't generate the default title +% $else$ +% \maketitle +$endif$ +$if(abstract)$ +\begin{abstract} +$abstract$ +\end{abstract} +$endif$ +$endif$ + +$if(first-chapter)$ +\setcounter{chapter}{$first-chapter$} +\addtocounter{chapter}{-1} +$endif$ + +$for(include-before)$ +$include-before$ + +$endfor$ +$if(toc)$ +$if(toc-title)$ +\renewcommand*\contentsname{$toc-title$} +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks] +$if(toc-title)$ + \frametitle{$toc-title$} +$endif$ + \setcounter{tocdepth}{$toc-depth$} + \tableofcontents +\end{frame} +$if(toc-own-page)$ +\newpage +$endif$ +$else$ +{ +$if(colorlinks)$ +\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$} +$endif$ +\setcounter{tocdepth}{$toc-depth$} +\tableofcontents +$if(toc-own-page)$ +\newpage +$endif$ +} +$endif$ +$endif$ +$if(lof)$ +\listoffigures +$endif$ +$if(lot)$ +\listoftables +$endif$ +$if(linestretch)$ +\setstretch{$linestretch$} +$endif$ +$if(has-frontmatter)$ +\mainmatter +$endif$ +$body$ + +$if(has-frontmatter)$ +\backmatter +$endif$ +$if(natbib)$ +$if(bibliography)$ +$if(biblio-title)$ +$if(has-chapters)$ +\renewcommand\bibname{$biblio-title$} +$else$ +\renewcommand\refname{$biblio-title$} +$endif$ +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue +$endif$ + \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} +$if(beamer)$ +\end{frame} +$endif$ + +$endif$ +$endif$ +$if(biblatex)$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue + \printbibliography[heading=none] +\end{frame} +$else$ +\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ +$endif$ + +$endif$ +$for(include-after)$ +$include-after$ + +$endfor$ +\end{document} diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/elsevier-harvard.csl b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/elsevier-harvard.csl new file mode 100755 index 0000000..5d88c51 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/elsevier-harvard.csl @@ -0,0 +1,239 @@ + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/nature-biotechnology.csl b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/nature-biotechnology.csl new file mode 100644 index 0000000..216c8b9 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/nature-biotechnology.csl @@ -0,0 +1,17 @@ + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/nature.csl b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/nature.csl new file mode 100644 index 0000000..7b058ba --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/nature.csl @@ -0,0 +1,154 @@ + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslogo.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslogo.pdf new file mode 100644 index 0000000..51d1a45 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslogo.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslogo.svg b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslogo.svg new file mode 100644 index 0000000..44431ff --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslogo.svg @@ -0,0 +1,5 @@ + + viewBox="0 0 621 690"> + + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslonglogo.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslonglogo.pdf new file mode 100644 index 0000000..50017f7 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslonglogo.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslonglogo.svg b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslonglogo.svg new file mode 100644 index 0000000..013b69d --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/rceeslonglogo.svg @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.pdf new file mode 100644 index 0000000..8b9afc3 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.png b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.png new file mode 100644 index 0000000..c292ad6 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.png differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.pptx b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.pptx new file mode 100644 index 0000000..94e54f5 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.pptx differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.svg b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.svg new file mode 100644 index 0000000..1218831 --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signms.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.pdf b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.pdf new file mode 100644 index 0000000..26d4e5f Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.pdf differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.png b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.png new file mode 100755 index 0000000..83e6904 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.png differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.pptx b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.pptx new file mode 100644 index 0000000..0a8c283 Binary files /dev/null and b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.pptx differ diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.svg b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.svg new file mode 100644 index 0000000..fde7fff --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/signmy.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/the-isme-j.csl b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/the-isme-j.csl new file mode 100755 index 0000000..730aefc --- /dev/null +++ b/_extensions/drwater/dwev/_extensions/drwater/dwev/inst/the-isme-j.csl @@ -0,0 +1,181 @@ + + diff --git a/_extensions/drwater/dwev/demo/beamer.qmd b/_extensions/drwater/dwev/demo/beamer.qmd new file mode 100644 index 0000000..1bbcdb7 --- /dev/null +++ b/_extensions/drwater/dwev/demo/beamer.qmd @@ -0,0 +1,53 @@ +--- +title: "Example PDF" +author: [Author] +date: "2019-06-16" +subject: "Markdown" +keywords: [Markdown, Example] +lang: "en" +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque ab +esse, obstat gravitate. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +# Obscura atque coniuge, per de coniunx + +- Vertitur iura tum nepotis causa motus. + +```html + + + + This is the title of the page. + + + This is an image. + + +``` + +# Scyrumve spiro subitusque mente + +```{.sql caption="Pallas nuper longusque cratere habuisse sepulcro pectore fertur."} +CREATE TYPE person_t AS ( + firstName VARCHAR(50) NOT NULL, + lastName VARCHAR(50) NOT NULL +); + +CREATE Or REPLACE FUNCTION getFormattedName(person) RETURNS text AS + $$ SELECT 'P: ' || initcap($1.firstName); $$ +LANGUAGE SQL; +``` \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/book.qmd b/_extensions/drwater/dwev/demo/book.qmd new file mode 100644 index 0000000..4b3c42c --- /dev/null +++ b/_extensions/drwater/dwev/demo/book.qmd @@ -0,0 +1,110 @@ +--- +title: "Example PDF" +author: [Author] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +book: true +classoption: [oneside] +titlepage: true, +# titlepage-rule-color: "360049" +titlepage-text-color: "FFFFFF" +titlepage-rule-height: 0 +titlepage-background: "inst/title-page-custom/background.pdf" +format: dwev-pdf +--- + +# Crinis mixtaque factisque ille + +## Aut nunc furori ad latarumque Philomela + +Lorem markdownum includite volenti monticolae videre vocem hac sparsit puta +gelidis vestros egressus sex. Undis eris per auguris armis. Est saevior pater. +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + +## Gaudet Silenus iuvenis + +Mulciber denique faces ingratus, in umeros umeri cum, iram ira custos non. +Pariterque admissa nubes, in ait ecce setae summis sacrorum me gaudete tellus. +Ille tu perire ille, artificis caede. + +```scala +def sumLeaves(t: Tree): Int = t match { + case Branch(l, r) => sumLeaves(l) + sumLeaves(r) + case Leaf(x) => x +} +``` + +Cephea rector minorque, quem corpora, +Argus. Superi hoc tenuavit timebant ossibus totque non serpere animo corpore +superas gelidae, comitate deus Iunonigenaeque +pectora. + +- Tuis Cereris armiferae fugiunt suus derepta vel +- Veniam mea cum sollertior arbore flore +- Ceae saecula +- Tamen est + +## Dies tunc in enim + +Gerunt urimur violaeque agricolis iussa locis puppis +simul cognita, vertentia Romana +obprobrium pignora superem est certe nondum suffuderat. Nox Pasiphaeia domo: +**abiit** catenas utro crimine gramina ingemuere mixtae. Quem trabibus etiamnum +orbe addita, eiaculatur videri cervo artus. Nutritur cupidine silentia Maeoniam +aere enim gemuit adgreditur, telasque *annis* nos cum Arctonque ingens lateri +cum iaculoque ferus. + +## Et dextra utque per lenius portus eburnae + +Cui vittas aris ibi putat dicere; factum sedere antiqua? Cognita Lyncides iuste +insuetum lacerum in sinamus arces; aves aevum spatiumque de utrumque moveret in? +Tertia ordine, Epidaurius, *has sed et* et novat: quod superare concubitusque +retia quoque, ne totiens. + +Est paenitet Cerealia sparsit; carne insignia in maris; tibi Nec, que Peleu meum +buxus. Propoetides formae magna auro ad gerat cohibentur facienda partem at +nunc, foret? **Ad stirpe**! Ut latius pararet: vestibus cumque pedibus ficta +prior summas cancer ipsa Marte Buten es +terruit. Opifex dixit oculos Oete quoque, quot silvarum abrepti nutrix concita +obsidis consistere fibula saxum, Antigonen minabitur tota. + +# Vagata eiectatamque sidera satis reducet + +## Talem ex aliquo ingemuit + +Lorem markdownum solus miserabile sitae. Tantum Syron limenque cupidine: litore +modo coniuge: in huc, illo crimen novena, vocisque gratia, quae. Sua manusque +patris nec meritorum pedibus hominis virgine, ruere tamen virtus aliter. Tunc +ego. Solitaque remittant fagus omnia eat. + +$$r_d^i(t+1) = \min\{r_s,\max\{0, r_d^i(t) + \beta(n_t - \lvert N_i(t)\rvert)\}\}$$ + +Obstitit silentia et novi non, huic metitur, coronantur lucos. Bracchia aura; +donis quod volucris illi futurae, ut +*venturorumque tellus* arma: saxumque. + +## Vera tum est putes adspicit noxque + +Hora et vidit figere tangi! Omni bis *prior nunc* capilli, pulsat tuam Pallante, +*suis*. Solae decore ipso armorum coitusque paro audita *viveret tibi* apparuit +flammasque lapides. Cursu anas usus eundo anticipata, intabescere quae concita +fallit. Dea corpore fabrae: nec Neptunus membris, falsa murice; fac Marte quam +in. + +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et. + +## Arachnes deus tum penetralia tempore aurea populante + +Lentae spissisque *carne*. Fixit inquit cautes et iugis novus sim quisquam nisi +haesurum vel deorum fetibus virgo. + +Sub nautae, tegebat clamat. Credas Parrhasio. Commemorat nescio liceatque +excipit! Uris clipeo ego visa amplexas meos ibitis condidit Taenaria, si. Tua +ora tempus patrio revulsos, tellus curru facies, Gange gemit agitata! + +Ruinam ipsaque sibi ovis Teucer Iovis tibi; erat versus neque victa attonitus +doque, quod! Dixit carmina, eo, per capillis quid lina, qua, ille. Siqua +caelestum flammas ferre super et saevissime inmisit quoque suis sic aspergine +vis praerupit. Et puellae summa eventu. +Placeat ut medio *plectrumque inferni* Talia; pertimui opem. diff --git a/_extensions/drwater/dwev/demo/boxes-with-pandoc-latex-environment-and-awesomebox.qmd b/_extensions/drwater/dwev/demo/boxes-with-pandoc-latex-environment-and-awesomebox.qmd new file mode 100644 index 0000000..3c26ccd --- /dev/null +++ b/_extensions/drwater/dwev/demo/boxes-with-pandoc-latex-environment-and-awesomebox.qmd @@ -0,0 +1,131 @@ +--- +title: "Boxes with pandoc-latex-environment and awesomebox" +author: [Author] +date: "2020-01-01" +subject: "Markdown" +keywords: [Markdown, Example] +lang: "en" +colorlinks: true +header-includes: +- | + ```{=latex} + \usepackage{awesomebox} + ``` +pandoc-latex-environment: + noteblock: [note] + tipblock: [tip] + warningblock: [warning] + cautionblock: [caution] + importantblock: [important] +format: dwev-pdf +--- + +# Boxes with `pandoc-latex-environment` and `awesomebox` + +This example demonstrates the use of the filter [`pandoc-latex-environments`] to create custom boxes with the [`awesomebox`] package. *pandoc-latex-environment* is a pandoc filter for adding LaTeX environment on specific HTML div tags. + + +## Box Types + +For a list of all available boxes and options visit the [`awesomebox` documentation](https://ctan.org/pkg/awesomebox). + +```markdown +::: note +Lorem ipsum dolor ... +::: +``` + +::: note +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam aliquet libero +quis lectus elementum fermentum. + +Fusce aliquet augue sapien, non efficitur mi ornare sed. Morbi at dictum +felis. Pellentesque tortor lacus, semper et neque vitae, egestas commodo nisl. +::: + +```markdown +::: tip +Lorem ipsum dolor ... +::: +``` + +::: tip +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam aliquet libero +quis lectus elementum fermentum. + +Fusce aliquet augue sapien, non efficitur mi ornare sed. Morbi at dictum +felis. Pellentesque tortor lacus, semper et neque vitae, egestas commodo nisl. +::: + +```markdown +::: warning +Lorem ipsum dolor ... +::: +``` + +::: warning +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam aliquet libero +quis lectus elementum fermentum. + +Fusce aliquet augue sapien, non efficitur mi ornare sed. Morbi at dictum +felis. Pellentesque tortor lacus, semper et neque vitae, egestas commodo nisl. +::: + +```markdown +::: caution +Lorem ipsum dolor ... +::: +``` + +::: caution +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam aliquet libero +quis lectus elementum fermentum. + +Fusce aliquet augue sapien, non efficitur mi ornare sed. Morbi at dictum +felis. Pellentesque tortor lacus, semper et neque vitae, egestas commodo nisl. +::: + +```markdown +::: important +Lorem ipsum dolor ... +::: +``` + +::: important +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam aliquet libero +quis lectus elementum fermentum. + +Fusce aliquet augue sapien, non efficitur mi ornare sed. Morbi at dictum +felis. Pellentesque tortor lacus, semper et neque vitae, egestas commodo nisl. +::: + +One can also use raw HTML `div` tags to create the custom environments. + +```markdown +
+Lorem ipsum dolor ... +
+``` + +
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam aliquet libero +quis lectus elementum fermentum. +
+ +Markdown formatting inside the environments is supported. + +::: important +**Lorem ipsum dolor** sit amet, `consectetur adipiscing` elit. + +``` +if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); +} +``` + +*Nam aliquet libero +quis lectus elementum fermentum.* +::: + +[`pandoc-latex-environments`]: https://github.com/chdemko/pandoc-latex-environment/ +[`awesomebox`]: https://ctan.org/pkg/awesomebox \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/boxes-with-pandoc-latex-environment-and-tcolorbox.qmd b/_extensions/drwater/dwev/demo/boxes-with-pandoc-latex-environment-and-tcolorbox.qmd new file mode 100644 index 0000000..5d460eb --- /dev/null +++ b/_extensions/drwater/dwev/demo/boxes-with-pandoc-latex-environment-and-tcolorbox.qmd @@ -0,0 +1,79 @@ +--- +title: "Boxes with pandoc-latex-environment and tcolorbox" +author: [Author] +date: "2020-01-01" +subject: "Markdown" +keywords: [Markdown, Example] +lang: "en" +colorlinks: true +header-includes: +- | + ```{=latex} + \usepackage{tcolorbox} + + \newtcolorbox{info-box}{colback=cyan!5!white,arc=0pt,outer arc=0pt,colframe=cyan!60!black} + \newtcolorbox{warning-box}{colback=orange!5!white,arc=0pt,outer arc=0pt,colframe=orange!80!black} + \newtcolorbox{error-box}{colback=red!5!white,arc=0pt,outer arc=0pt,colframe=red!75!black} + ``` +pandoc-latex-environment: + tcolorbox: [box] + info-box: [info] + warning-box: [warning] + error-box: [error] +format: dwev-pdf +--- + +# Boxes with `pandoc-latex-environment` and `tcolorbox` + +This example demonstrates the use of the filter [`pandoc-latex-environments`] +to create custom boxes with the [`tcolorbox`] package. +*pandoc-latex-environment* is a pandoc filter for adding LaTeX environment on +specific HTML div tags. For a list of all available options visit the +[`tcolorbox` documentation](https://ctan.org/pkg/tcolorbox). + +## Simple Box + +::: box +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam aliquet libero +quis lectus elementum fermentum. +::: + +## Markdown inside the Box + +Markdown formatting inside the environment is supported. + +::: box +Lorem ipsum **dolor** sit amet, `consectetur adipiscing` elit. + +``` +if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); +} +``` + +*Nam aliquet libero +quis lectus elementum fermentum.* +::: + +## Custom Box + +One can define custom boxes in the LaTeX preamble with the variable +`header-includes` at the top of this document. + +::: info +**Info**: This is a custom box that may be used to show info messages in your +document. +::: + +::: warning +**Warning**: This is a custom box that may be used to show warning messages in +your document. +::: + +::: error +**Error**: This is a custom box that may be used to show error messages in your +document. +::: + +[`pandoc-latex-environments`]: https://github.com/chdemko/pandoc-latex-environment/ +[`tcolorbox`]: https://ctan.org/pkg/tcolorbox \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/code-blocks-listings.qmd b/_extensions/drwater/dwev/demo/code-blocks-listings.qmd new file mode 100644 index 0000000..5adf4d2 --- /dev/null +++ b/_extensions/drwater/dwev/demo/code-blocks-listings.qmd @@ -0,0 +1,56 @@ +--- +title: "Example PDF" +author: [Author] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +## Aesculeae domus vincemur et Veneris adsuetus lapsum + +Lorem markdownum Letoia, et alios -- "figurae flectentem annis aliquid Peneosque" ab +esse, 'obstat' gravitate. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. Obscura atque coniuge, per de coniunx, sibi medias +commentaque virgine anima tamen comitemque petis, sed. + +```{.html caption="Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. Obscura atque coniuge, per de coniunx, sibi medias +commentaque virgine anima tamen comitemque petis, sed."} + + + + This is the title of the page. + + + This is a link. + This is an image. + + +``` + +Vertitur iura tum nepotis causa; motus. Diva virtus! Acrota +destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente +Pirithoi abstulit, lapides. + +```sql +CREATE TYPE person_t AS ( + firstName VARCHAR(50) NOT NULL, + lastName VARCHAR(50) NOT NULL +); +CREATE Or REPLACE FUNCTION getFormattedName(person) RETURNS text AS + $$ SELECT 'P: ' || initcap($1.firstName); $$ +LANGUAGE SQL; +``` \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/code-blocks-without-listings.qmd b/_extensions/drwater/dwev/demo/code-blocks-without-listings.qmd new file mode 100644 index 0000000..d16aee7 --- /dev/null +++ b/_extensions/drwater/dwev/demo/code-blocks-without-listings.qmd @@ -0,0 +1,53 @@ +--- +title: "Example PDF" +author: [Author] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +lang: "en" +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque +abesse obstat. + +```java +public class Example implements LoremIpsum { + public static void map(String[] sortedLeft, Long[] sortedRight, int splitIndex) { + if(sortedLeft == null || sortedRight == null) { + System.err.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur +obscura atque coniuge. + +```html + + + + This is the title of the page. + + + This is a link. + This is an image. + + +``` + +Vertitur iura tum nepotis causa; motus. Diva virtus! Acrota destruitis vos +iubet quo et classis excessere. + +```sql +CREATE TYPE person_t AS ( + firstName VARCHAR(50) NOT NULL, +); + +CREATE Or REPLACE FUNCTION getFormattedName(person) RETURNS text AS + $$ SELECT 'P: ' || initcap($1.firstName); $$ +LANGUAGE SQL; +``` \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/header-and-footer.qmd b/_extensions/drwater/dwev/demo/header-and-footer.qmd new file mode 100644 index 0000000..a8f230c --- /dev/null +++ b/_extensions/drwater/dwev/demo/header-and-footer.qmd @@ -0,0 +1,63 @@ +--- +title: "Example PDF" +author: [Author] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +header-left: "\\hspace{1cm}" +header-center: "\\leftmark" +header-right: "Page \\thepage" +footer-left: "\\thetitle" +footer-center: "This is \\LaTeX{}" +footer-right: "\\theauthor" +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +## Aesculeae domus vincemur et Veneris adsuetus lapsum + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque ab +esse, obstat gravitate. Obscura atque coniuge, per de coniunx, sibi **medias +commentaque virgine** anima tamen comitemque petis, sed. In Amphion vestros +hamos ire arceor mandere spicula, in licet aliquando. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. +Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva virtus! Acrota +destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente +Pirithoi abstulit, lapides. + +## Lydia caelo recenti haerebat lacerum ratae at + +Te concepit pollice fugit vias alumno **oras** quam potest +[rursus](http://example.com#rursus) optat. Non evadere orbem equorum, spatiis, +vel pede inter si. + +1. De neque iura aquis +2. Frangitur gaudia mihi eo umor terrae quos +3. Recens diffudit ille tantum + +\begin{equation}\label{eq:neighbor-propability} + p_{ij}(t) = \frac{\ell_j(t) - \ell_i(t)}{\sum_{k \in N_i(t)}^{} \ell_k(t) - \ell_i(t)} +\end{equation} + +Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae +adessent arbor. Florente perque at condeturque saxa et ferarum promittis tendebat. Armos nisi obortas refugit me. + +> Et nepotes poterat, se qui. Euntem ego pater desuetaque aethera Maeandri, et +[Dardanio geminaque](http://example.com#Dardanio_geminaque) cernit. Lassaque poenas +nec, manifesta $\pi r^2$ mirantia captivarum prohibebant scelerato gradus unusque +dura. + +- Permulcens flebile simul +- Iura tum nepotis causa motus diva virtus Acrota. Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae adessent arbor. Florente perque at ire arcum. \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/images-and-tables.qmd b/_extensions/drwater/dwev/demo/images-and-tables.qmd new file mode 100644 index 0000000..043e46d --- /dev/null +++ b/_extensions/drwater/dwev/demo/images-and-tables.qmd @@ -0,0 +1,66 @@ +--- +title: "Example PDF" +author: [Author] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +lang: "en" +table-use-row-colors: false +format: dwev-pdf +--- + +# Images and Tables + +## LaTeX Table with Caption + +At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr. + +\begin{longtable}[]{llllllll} +\caption[tbl-aa]{Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.} \\ +\toprule +Test Nr. & Position & Radius & Rot & Grün & Blau & +beste Fitness & Abweichung\tabularnewline +\midrule +\endhead +1 & 20 \% & 20 \% & 20 \% & 20 \% & 20 \% & 7,5219 & +0,9115\tabularnewline +2 & 0 \% & 25 \% & 25 \% & 25 \% & 25 \% & 8,0566 & +1,4462\tabularnewline +3 & 0 \% & 0 \% & 33 \% & 33 \% & 33 \% & 8,7402 & 2,1298\tabularnewline +4 & 50 \% & 20 \% & 10 \% & 10 \% & 10 \% & 6,6104 & +0,0000\tabularnewline +5 & 70 \% & 0 \% & 10 \% & 10 \% & 10 \% & 7,0696 & +0,4592\tabularnewline +6 & 20 \% & 50 \% & 10 \% & 10 \% & 10 \% & 7,0034 & +0,3930\tabularnewline +\bottomrule +\end{longtable} + +At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr. + +## Image with Caption + +![Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.](inst/images-and-tables/image.png) + +## Markdown Table without Caption + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque abesse, obstat gravitate. Obscura atque coniuge, per de coniunx, sibi medias +commentaque virgine anima tamen comitemque petis, sed. In Amphion vestros +hamos ire arceor mandere spicula, in licet aliquando. + +Test Nr. | Position | Radius | Rot | Grün | Blau | beste Fitness | Abweichung | +|---|---|---|---|---|---|---|---| +1 | 20 % | 20 % | 20 % | 20 % | 20 % | 7,5219 | 0,9115 | +2 | 0 % | 25 % | 25 % | 25 % | 25 % | 8,0566 | 1,4462 | +3 | 0 % | 0 % | 33 % | 33 % | 33 % | 8,7402 | 2,1298 | +4 | 50 % | 20 % | 10 % | 10 % | 10 % | 6,6104 | 0,0000 | +5 | 70 % | 0 % | 10 % | 10 % | 10 % | 7,0696 | 0,4592 | +6 | 20 % | 50 % | 10 % | 10 % | 10 % | 7,0034 | 0,3930 | +7 | 40 % | 15 % | 15 % | 15 % | 15 % | 6,9122 | 0,3018 | + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. +Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva virtus! Acrota destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente Pirithoi abstulit, lapides. + +## Image without Caption + +![](inst/images-and-tables/image.png) diff --git a/_extensions/drwater/dwev/demo/images-and-tables.tex b/_extensions/drwater/dwev/demo/images-and-tables.tex new file mode 100644 index 0000000..d136a59 --- /dev/null +++ b/_extensions/drwater/dwev/demo/images-and-tables.tex @@ -0,0 +1,504 @@ +%% +% Copyright (c) 2017 - 2024, Pascal Wagler; +% Copyright (c) 2014 - 2024, John MacFarlane +% +% All rights reserved. +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions +% are met: +% +% - Redistributions of source code must retain the above copyright +% notice, this list of conditions and the following disclaimer. +% +% - Redistributions in binary form must reproduce the above copyright +% notice, this list of conditions and the following disclaimer in the +% documentation and/or other materials provided with the distribution. +% +% - Neither the name of John MacFarlane nor the names of other +% contributors may be used to endorse or promote products derived +% from this software without specific prior written permission. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +% "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +% FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +% COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +% INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +% LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +% ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE. +%% + +%% +% This is the Eisvogel pandoc LaTeX template. +% +% For usage information and examples visit the official GitHub page: +% https://github.com/Wandmalfarbe/pandoc-latex-template +%% + +% Options for packages loaded elsewhere +\PassOptionsToPackage{unicode}{hyperref} +\PassOptionsToPackage{hyphens}{url} +\PassOptionsToPackage{dvipsnames,svgnames,x11names,table}{xcolor} +% +\documentclass[ + paper=a4, + ,captions=tableheading +]{scrartcl} +\usepackage{amsmath,amssymb} +% Use setspace anyway because we change the default line spacing. +% The spacing is changed early to affect the titlepage and the TOC. +\usepackage{setspace} +\setstretch{1.2} +\usepackage{iftex} +\ifPDFTeX + \usepackage[T1]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provide euro and other symbols +\else % if luatex or xetex + \usepackage{unicode-math} % this also loads fontspec + \defaultfontfeatures{Scale=MatchLowercase} + \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} +\fi +\usepackage{lmodern} +\ifPDFTeX\else + % xetex/luatex font selection +\fi +% Use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\IfFileExists{microtype.sty}{% use microtype if available + \usepackage[]{microtype} + \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +\makeatletter +\@ifundefined{KOMAClassName}{% if non-KOMA class + \IfFileExists{parskip.sty}{% + \usepackage{parskip} + }{% else + \setlength{\parindent}{0pt} + \setlength{\parskip}{6pt plus 2pt minus 1pt}} +}{% if KOMA class + \KOMAoptions{parskip=half}} +\makeatother +\usepackage{xcolor} +\definecolor{default-linkcolor}{HTML}{A50000} +\definecolor{default-filecolor}{HTML}{A50000} +\definecolor{default-citecolor}{HTML}{4077C0} +\definecolor{default-urlcolor}{HTML}{4077C0} +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering,]{geometry} +\usepackage{longtable,booktabs,array} +\usepackage{calc} % for calculating minipage widths +% Correct order of tables after \paragraph or \subparagraph +\usepackage{etoolbox} +\makeatletter +\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} +\makeatother +% Allow footnotes in longtable head/foot +\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} +\makesavenoteenv{longtable} +% add backlinks to footnote references, cf. https://tex.stackexchange.com/questions/302266/make-footnote-clickable-both-ways +\usepackage{footnotebackref} +\usepackage{graphicx} +\makeatletter +% \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +% \def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +% \makeatother +% % Scale images if necessary, so that they will not overflow the page +% % margins by default, and it is still possible to overwrite the defaults +% % using explicit options in \includegraphics[width, height, ...]{} +% \setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +\newsavebox\pandoc@box +\newcommand*\pandocbounded[1]{% scales image to fit in text height/width + \sbox\pandoc@box{#1}% + \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% + \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% + \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both + \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% + \else\usebox{\pandoc@box}% + \fi% +} +% Set default figure placement to htbp +\makeatletter +\def\fps@figure{htbp} +\makeatother +% \makeatletter Old options from template, replaced with quarto defaults above +% \newsavebox\pandoc@box +% \newcommand*\pandocbounded[1]{% scales image to fit in text height/width +% \sbox\pandoc@box{#1}% +% \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% +% \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% +% \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both +% \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% +% \else\usebox{\pandoc@box}% +% \fi% +% } +% % Set default figure placement to htbp +% % Make use of float-package and set default placement for figures to H. +% % The option H means 'PUT IT HERE' (as opposed to the standard h option which means 'You may put it here if you like'). +% \usepackage{float} +% \floatplacement{figure}{H} +% \makeatother +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +\setcounter{secnumdepth}{-\maxdimen} % remove section numbering +% Make \paragraph and \subparagraph free-standing +\makeatletter +\ifx\paragraph\undefined\else + \let\oldparagraph\paragraph + \renewcommand{\paragraph}{ + \@ifstar + \xxxParagraphStar + \xxxParagraphNoStar + } + \newcommand{\xxxParagraphStar}[1]{\oldparagraph*{#1}\mbox{}} + \newcommand{\xxxParagraphNoStar}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else + \let\oldsubparagraph\subparagraph + \renewcommand{\subparagraph}{ + \@ifstar + \xxxSubParagraphStar + \xxxSubParagraphNoStar + } + \newcommand{\xxxSubParagraphStar}[1]{\oldsubparagraph*{#1}\mbox{}} + \newcommand{\xxxSubParagraphNoStar}[1]{\oldsubparagraph{#1}\mbox{}} +\fi +\makeatother +\ifLuaTeX +\usepackage[bidi=basic]{babel} +\else +\usepackage[bidi=default]{babel} +\fi +\babelprovide[main,import]{english} +% get rid of language-specific shorthands (see #6817): +\let\LanguageShortHands\languageshorthands +\def\languageshorthands#1{} +\ifLuaTeX + \usepackage[english]{selnolig} % disable illegal ligatures +\fi +\makeatletter +\@ifpackageloaded{caption}{}{\usepackage{caption}} +\AtBeginDocument{% +\ifdefined\contentsname + \renewcommand*\contentsname{Table of contents} +\else + \newcommand\contentsname{Table of contents} +\fi +\ifdefined\listfigurename + \renewcommand*\listfigurename{List of Figures} +\else + \newcommand\listfigurename{List of Figures} +\fi +\ifdefined\listtablename + \renewcommand*\listtablename{List of Tables} +\else + \newcommand\listtablename{List of Tables} +\fi +\ifdefined\figurename + \renewcommand*\figurename{Figure} +\else + \newcommand\figurename{Figure} +\fi +\ifdefined\tablename + \renewcommand*\tablename{Table} +\else + \newcommand\tablename{Table} +\fi +} +\@ifpackageloaded{float}{}{\usepackage{float}} +\floatstyle{ruled} +\@ifundefined{c@chapter}{\newfloat{codelisting}{h}{lop}}{\newfloat{codelisting}{h}{lop}[chapter]} +\floatname{codelisting}{Listing} +\newcommand*\listoflistings{\listof{codelisting}{List of Listings}} +\makeatother +\makeatletter +\makeatother +\makeatletter +\@ifpackageloaded{caption}{}{\usepackage{caption}} +\@ifpackageloaded{subcaption}{}{\usepackage{subcaption}} +\makeatother +\usepackage{bookmark} +\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available +\urlstyle{same} +\hypersetup{ + pdftitle={Example PDF}, + pdfauthor={Author}, + pdflang={en}, + pdfsubject={Markdown}, + pdfkeywords={Markdown, Example}, + colorlinks=true, + linkcolor={blue}, + filecolor={default-filecolor}, + citecolor={default-citecolor}, + urlcolor={default-urlcolor}, + breaklinks=true, + pdfcreator={LaTeX via pandoc with the Eisvogel template}} +\title{Example PDF} +\author{Author} +\date{2017-02-20} + + + +%% +%% added +%% + + +% +% for the background color of the title page +% + +% +% break urls +% +\PassOptionsToPackage{hyphens}{url} + +% +% When using babel or polyglossia with biblatex, loading csquotes is recommended +% to ensure that quoted texts are typeset according to the rules of your main language. +% +\usepackage{csquotes} + +% +% captions +% +\definecolor{caption-color}{HTML}{777777} +\usepackage[font={stretch=1.2}, textfont={color=caption-color}, position=top, skip=4mm, labelfont=bf, singlelinecheck=false, justification=raggedright]{caption} +\setcapindent{0em} + +% +% blockquote +% +\definecolor{blockquote-border}{RGB}{221,221,221} +\definecolor{blockquote-text}{RGB}{119,119,119} +\usepackage{mdframed} +\newmdenv[rightline=false,bottomline=false,topline=false,linewidth=3pt,linecolor=blockquote-border,skipabove=\parskip]{customblockquote} +\renewenvironment{quote}{\begin{customblockquote}\list{}{\rightmargin=0em\leftmargin=0em}% +\item\relax\color{blockquote-text}\ignorespaces}{\unskip\unskip\endlist\end{customblockquote}} + +% +% Source Sans Pro as the default font family +% Source Code Pro for monospace text +% +% 'default' option sets the default +% font family to Source Sans Pro, not \sfdefault. +% +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + \else % if not pdftex + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + + % XeLaTeX specific adjustments for straight quotes: https://tex.stackexchange.com/a/354887 + % This issue is already fixed (see https://github.com/silkeh/latex-sourcecodepro/pull/5) but the + % fix is still unreleased. + % TODO: Remove this workaround when the new version of sourcecodepro is released on CTAN. + \ifxetex + \makeatletter + \defaultfontfeatures[\ttfamily] + { Numbers = \sourcecodepro@figurestyle, + Scale = \SourceCodePro@scale, + Extension = .otf } + \setmonofont + [ UprightFont = *-\sourcecodepro@regstyle, + ItalicFont = *-\sourcecodepro@regstyle It, + BoldFont = *-\sourcecodepro@boldstyle, + BoldItalicFont = *-\sourcecodepro@boldstyle It ] + {SourceCodePro} + \makeatother + \fi + \fi + +% +% heading color +% +\definecolor{heading-color}{RGB}{40,40,40} +\addtokomafont{section}{\color{heading-color}} +% When using the classes report, scrreprt, book, +% scrbook or memoir, uncomment the following line. +%\addtokomafont{chapter}{\color{heading-color}} + +% +% variables for title, author and date +% +\usepackage{titling} +\title{Example PDF} +\author{Author} +\date{2017-02-20} + +% +% tables +% + +\definecolor{table-row-color}{HTML}{F5F5F5} +\definecolor{table-rule-color}{HTML}{999999} + +%\arrayrulecolor{black!40} +\arrayrulecolor{table-rule-color} % color of \toprule, \midrule, \bottomrule +\setlength\heavyrulewidth{0.3ex} % thickness of \toprule, \bottomrule +\renewcommand{\arraystretch}{1.3} % spacing (padding) + + +% +% remove paragraph indentation +% +\setlength{\parindent}{0pt} +\setlength{\parskip}{6pt plus 2pt minus 1pt} +\setlength{\emergencystretch}{3em} % prevent overfull lines + +% +% +% Listings +% +% + + +% +% header and footer +% +\usepackage[headsepline,footsepline]{scrlayer-scrpage} + +\newpairofpagestyles{eisvogel-header-footer}{ + \clearpairofpagestyles + \ihead*{Example PDF} + \chead*{} + \ohead*{2017-02-20} + \ifoot*{Author} + \cfoot*{} + \ofoot*{\thepage} + \addtokomafont{pageheadfoot}{\upshape} +} +\pagestyle{eisvogel-header-footer} + + + +%% +%% end added +%% + +\begin{document} + +%% +%% begin titlepage +%% + +%% +%% end titlepage +%% + +% \maketitle + + +\section{Images and Tables}\label{images-and-tables} + +\subsection{LaTeX Table with Caption}\label{latex-table-with-caption} + +At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd +gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem +ipsum dolor sit amet, consetetur sadipscing elitr. + +\begin{longtable*}[]{llllllll} +\caption[tbl-aa]{Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.} \\ +\toprule +Test Nr. & Position & Radius & Rot & Grün & Blau & +beste Fitness & Abweichung\tabularnewline +\midrule +\endhead +1 & 20 \% & 20 \% & 20 \% & 20 \% & 20 \% & 7,5219 & +0,9115\tabularnewline +2 & 0 \% & 25 \% & 25 \% & 25 \% & 25 \% & 8,0566 & +1,4462\tabularnewline +3 & 0 \% & 0 \% & 33 \% & 33 \% & 33 \% & 8,7402 & 2,1298\tabularnewline +4 & 50 \% & 20 \% & 10 \% & 10 \% & 10 \% & 6,6104 & +0,0000\tabularnewline +5 & 70 \% & 0 \% & 10 \% & 10 \% & 10 \% & 7,0696 & +0,4592\tabularnewline +6 & 20 \% & 50 \% & 10 \% & 10 \% & 10 \% & 7,0034 & +0,3930\tabularnewline +\bottomrule +\end{longtable*} + +At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd +gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem +ipsum dolor sit amet, consetetur sadipscing elitr. + +\subsection{Image with Caption}\label{image-with-caption} + +\begin{figure}[H] + +{\centering \pandocbounded{\includegraphics[keepaspectratio]{inst/images-and-tables/image.png}} + +} + +\caption{Nam liber tempor cum soluta nobis eleifend option congue nihil +imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum +dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh +euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.} + +\end{figure}% + +\subsection{Markdown Table without +Caption}\label{markdown-table-without-caption} + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid +Peneosque abesse, obstat gravitate. Obscura atque coniuge, per de +coniunx, sibi medias commentaque virgine anima tamen comitemque petis, +sed. In Amphion vestros hamos ire arceor mandere spicula, in licet +aliquando. + +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 14\tabcolsep) * \real{0.1250}} + >{\raggedright\arraybackslash}p{(\linewidth - 14\tabcolsep) * \real{0.1250}} + >{\raggedright\arraybackslash}p{(\linewidth - 14\tabcolsep) * \real{0.1250}} + >{\raggedright\arraybackslash}p{(\linewidth - 14\tabcolsep) * \real{0.1250}} + >{\raggedright\arraybackslash}p{(\linewidth - 14\tabcolsep) * \real{0.1250}} + >{\raggedright\arraybackslash}p{(\linewidth - 14\tabcolsep) * \real{0.1250}} + >{\raggedright\arraybackslash}p{(\linewidth - 14\tabcolsep) * \real{0.1250}} + >{\raggedright\arraybackslash}p{(\linewidth - 14\tabcolsep) * \real{0.1250}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +Test Nr. +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +Position +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +Radius +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +Rot +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +Grün +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +Blau +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +beste Fitness +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +Abweichung +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +1 & 20 \% & 20 \% & 20 \% & 20 \% & 20 \% & 7,5219 & 0,9115 \\ +2 & 0 \% & 25 \% & 25 \% & 25 \% & 25 \% & 8,0566 & 1,4462 \\ +3 & 0 \% & 0 \% & 33 \% & 33 \% & 33 \% & 8,7402 & 2,1298 \\ +4 & 50 \% & 20 \% & 10 \% & 10 \% & 10 \% & 6,6104 & 0,0000 \\ +5 & 70 \% & 0 \% & 10 \% & 10 \% & 10 \% & 7,0696 & 0,4592 \\ +6 & 20 \% & 50 \% & 10 \% & 10 \% & 10 \% & 7,0034 & 0,3930 \\ +7 & 40 \% & 15 \% & 15 \% & 15 \% & 15 \% & 6,9122 & 0,3018 \\ +\end{longtable} + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore +fertur. Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva +virtus! Acrota destruitis vos iubet quo et classis excessere Scyrumve +spiro subitusque mente Pirithoi abstulit, lapides. + +\subsection{Image without Caption}\label{image-without-caption} + +\pandocbounded{\includegraphics[keepaspectratio]{inst/images-and-tables/image.png}} + +\end{document} diff --git a/_extensions/drwater/dwev/demo/language-chinese.qmd b/_extensions/drwater/dwev/demo/language-chinese.qmd new file mode 100644 index 0000000..ea6665a --- /dev/null +++ b/_extensions/drwater/dwev/demo/language-chinese.qmd @@ -0,0 +1,52 @@ +--- +title: "価備手述改陸夜数木田了転由。" +author: [作者日期] +date: "2019-01-10" +subject: "Markdown" +keywords: [Markdown, Example] +lang: zh-CN +svg: true +fig-pos: "!t" +colorlinks: true +urlcolor: blue +sansfont: "Gill Sans" +sansfontoptions: + - Color=39729E +mainfont: "Source Sans 3" #| Verdana (fontsize: 11pt) # Source Sans 3 | Times New Roman| Helvetica | PT Sans +monofont: "JetBrains Mono" +mathfont: "Cambria Math" +CJKmainfont: "Noto Serif CJK SC" +CJKsansfont: "Noto Sans CJK SC" +CJKmonofont: "Noto Sans Mono CJK SC" +# 确保中文标点符号正确处理 +CJKoptions: | + AutoFakeBold=true +format: dwev-pdf +--- + +# 陣委百三秋康経重示面合雪減背井足府迷根間。 + +陣委百三秋康経重示面合雪減背井足府迷根間。米式十良提馬紀研園要中募用刊。考稿協中写万捜寄三誠女文惑応担。動忍負陣表要回厳盛質属全任。意渡稿針当京注合在成唱皇月諸感丘売。業暮題武同海変公飯伝習真質期込者。読性聞点社質求庫勢応系飛。読有約求不政球県台却観展明来連使。暗双属場證北日増吉望団私録写日奈惑紙。 + +賞方広選付疑京将主豊祉歳兆。亮行災視民信軒全太当刑際大。設紙校系顔実困講将用求年作。禁査調線無聞銅案性約会有整兄名城敬番棋。催題趣蔵今権全演権専治整。記査調埼毎断読犬石川年実作問情設情経。地面観参軽地多愛提帯瀬面側天側。価備手述改陸夜数木田了転由。上転為護吾載何研防著取足調出声的与歯。 + + +```{r} +"asdfads阿斯顿发斯蒂芬" +``` + + + +## 参街能業南達伊市無百兆無聞手覧常努団他。 + +参街能業南達伊市無百兆無聞手覧常努団他。応臨覧処面板施盛会同交展安期。善無継東約知紙地言展掲世起都幕紙仕。配稿理第心酸知月勝庭上図真全。本顕品毎信稿蓄秀神池課道。空米打資級油週報白受支写住文科権初航逮政。売打込箕長陳雪択選男真庭。改取確育迎田袴者豊尾京毎景終彦思。意試役能五子込宙転知校細。内速排索医林経一応係古測辺水。 + +紋正介市及早拒木霊記済複治中。了岐都援盛手価民選覧必庭温背木済円力治。年生算純投器小市系統出字明稚喫部秘集。背伝歳適虫解無集園意明属賞方社件。公紹情高無主考全度監授掲。三退新田面封一基会功康売詳夜増義芸。特積夫紀北赤子演載識顔産済再測質。新岐張年読原体畑住郎門当合止吹士天意藤。明延立派購新政医士定速農。 + +神図先名当揃存工紙広渡民晩記各面得続告増。将枝素実更造藤胞界投健記室申張講訴。店裁山党手政者校訓会清終定浪案。普大的比将響認経変度与合兄退景意経。歌池京割覧製断訳載割写載女作想用魂覚申。舞夜負亡古特在事準催進不全先自代上業後者。学上育手係真最芋本代定作供下能読分。 + +- 汁酬英性向竹室比著給稿刻学年機稿生写。投面記偏回必写際著危女競林思。対事管現馬打能夜月顧身最恵共谷盟社必出。事退問更理併裏少切写禁権丁金提限最写求。者打記舎作馬研作辞家地子無遠者情島。諸井訓団取転燃大広応毎断略並。力持極業育権者住今展線際玉。集政謙期伝変争一他拉方海話連委下混必。囲渡園早位形量英酒椅食始発児政。 +- 年京船装街論初維器送遂考都連。携訪後細断点洋再説月間必道休光事築河。聞直電原竹銭報発興埼校球米口暮定奨重芸聞。京和使検聞服運加航認著著真技事実。弘断機試勢感金換稼治山谷皇真人肥霧。夜需崎影書属葉総登抜見発養内日現際園。場小行評歳映徹浸力政中募暮日朝金子武東。映申地換方無次記暮動練供事惑部意喜半戦壇。 +- 勝技枝図辞決受温見会図休自意少帰質者栄。務単時幹典盟園先入販江紀聞択色務。逮人覇品努博関復際部給体寛明理。限袖住教催広州係響体回接決治過銀。世提応枝録少説営援紙遠勤災宿。試電重捕切譜練治真戦将東。在最真休治義地杉調掲参親平。必整能怒哲希存雪注気付終表転県横隊早。覧教夕徹八学然害犬米無調億立図平受受位編。 + +昌手挨一主要入削禁図送無高慕収後毎投業。感心台観道際町存更団打目今。生記投報重東点回際護高田独東。球野技検業大芸聞共最集飛禁。無黄手著凱縮産総智幕配示。名旧合提丼畿幅間任問場投悪変団。津地全真罪禁友容崩図新足連問完。域勲市録関写気意傷遣米安極漢。個疑調尾陸能案相浮接格校田新本下能。日銭信茶岡実締繰先分読独娘製商損真情。 diff --git a/_extensions/drwater/dwev/demo/language-german.qmd b/_extensions/drwater/dwev/demo/language-german.qmd new file mode 100644 index 0000000..55ca7d1 --- /dev/null +++ b/_extensions/drwater/dwev/demo/language-german.qmd @@ -0,0 +1,58 @@ +--- +title: "Vinaque sanguine metuenti cuiquam Alcyone fixus" +author: [Author Name] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +lang: "de" +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +## Aesculeae domus vincemur et Veneris adsuetus lapsum + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque ab +esse, obstat gravitate. Obscura atque coniuge, per de coniunx, sibi **medias +commentaque virgine** anima tamen comitemque petis, sed. In Amphion vestros +hamos ire arceor mandere spicula, in licet aliquando. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. +Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva virtus! Acrota +destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente +Pirithoi abstulit, lapides. + +## Lydia caelo recenti haerebat lacerum ratae at + +Te concepit pollice fugit vias alumno **oras** quam potest +[rursus](http://example.com#rursus) optat. Non evadere orbem equorum, spatiis, +vel pede inter si. + +1. De neque iura aquis +2. Frangitur gaudia mihi eo umor terrae quos +3. Recens diffudit ille tantum + +\begin{equation}\label{eq:neighbor-propability} + p_{ij}(t) = \frac{\ell_j(t) - \ell_i(t)}{\sum_{k \in N_i(t)}^{} \ell_k(t) - \ell_i(t)} +\end{equation} + +Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae +adessent arbor. Florente perque at condeturque saxa et ferarum promittis tendebat. Armos nisi obortas refugit me. + +Et nepotes poterat, se qui. Euntem ego pater desuetaque aethera Maeandri, et +[Dardanio geminaque](http://example.com#Dardanio_geminaque) cernit. Lassaque poenas +nec, manifesta $\pi r^2$ mirantia captivarum prohibebant scelerato gradus unusque +dura. + +- Permulcens flebile simul +- Iura tum nepotis causa motus diva virtus Acrota. Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae adessent arbor. Florente perque at ire arcum. \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/language-japanese.qmd b/_extensions/drwater/dwev/demo/language-japanese.qmd new file mode 100644 index 0000000..7932964 --- /dev/null +++ b/_extensions/drwater/dwev/demo/language-japanese.qmd @@ -0,0 +1,33 @@ +--- +title: "よ派にへたひ素ヘムナフュてるあてっはれねね区露。巣擢" +author: [むて絵ヤイヤ手津絵] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +format: dwev-pdf +--- + +# よ派にへたひ素ヘムナフュてるあてっはれねね区露。巣擢 + + +もに氏留列阿ゃけんリヌョソュろまけやほこまネクフコテユうめね瀬雲舳目ょ舳鵜みやいみま。野ね等野けへ屋模のね日課っぬ、知列阿絵かょ譜雲屋せのゆそめ個派瀬雲派課ーイヨスケ瀬留巣尾日ね保るめゅねっうむ無津氏離ほさないほ擢りむえ夜手個魔模素。 + +よ派にへたひ素ヘムナフュてるあてっはれねね区露。巣擢。むて絵ヤイヤ手津絵舳ふち屋区根っクキオ氏露すムフヘゅ二遊むねれみらなまそ瀬ぬゆたヘクアウはてとしまる知。 + +むゆくら雲津手都あもは日遊れりゅへらっ日保留鵜絵す。の露日無ゆ遊二日りスツ毛留御遊擢御無模無ょやゆ樹毛阿留等、樹ルキテひょとて区列屋。うかるゃええま二擢きかしあんつ擢、っさく遊手名区列手ウヌマ区根以擢模擢素けせのれひんほおはよこふきなろ樹舳野尾尾ゃほふ列擢瀬舳名個区等こに名津、根夜、お。ろやほ保素根列らゆやしえろむっンサハラオ。 + +## とほ知他え目絵樹せ津素舳雲巣魔氏派夜列魔 + +まの課譜都手、やいゆぬてほめてよかおそふおょこ尾夜く阿差課根ぬナヒメケ舳二しけやろこち譜は巣津やれま、ネョセカあきあメシみ根根るあ、ろへ離都課ろうらくぬさにせぬ尾模等せ樹魔いそょ毛もし御名氏知。 + +課瀬毛御都列ヒャマナカフモ絵区区遊譜ほ、ほすゃもキウぬノサクサめろそなる他他津ふまお、譜阿手派夜っ他個かたか舳鵜日魔日雲派二離、にひ巣氏めすおひふめへな区っ鵜名瀬むう。ヨツミメ区素他都めすそか課区なうよ以遊へ。いり他譜けっへつ。保阿模野列魔てえ。以区素。 + +離擢留舳区クツコこつろと魔、ょもさよ尾うとほ知他え目絵樹せ津素舳雲巣魔氏派夜列魔氏絵夜課阿ふ知知区擢魔野さうにりよりうゅ個課列野ゃす毛二絵手ぬえ派尾樹屋夜。夜絵毛毛すりおいし遊手夜毛無とゆ瀬野毛名個ふふえゃ無都名無他氏等ふこたも。 + +以たろきお都ゆし阿列鵜擢おんか、ッロマオゅ露他野列せ譜模ョー鵜尾野手毛素、ひす素野ろ氏御氏屋ほはもらりむふ離個とろいそつむ差手こつけっとへせっ。りぬ目無舳めむや離離ょほんく阿せえのんやや離雲雲魔はゃれひ。りそさ無阿樹さかん屋絵氏、つ区差。しレヨオキホテゆもお尾巣けのすもめきむやひけ。尾御津区列列課都雲り樹めぬやむては、舳名夜ッラチユ列都、保露、魔鵜。 + +1. りぬ目無舳めむや離離ょほんく阿せえのんやや離雲雲魔はゃれひ。りそさ無阿樹さかん屋絵氏、つ区差。しレヨオキホテゆもお +2. へ舳列っに「屋素留御以根」露派差離鵜けきうっ雲目以ナシ。日氏すゅともむ樹留素ふりう氏日夜れと +3. 他根かかぬ、くきれみけおへえほん保派絵くけよ譜モヌッアアウカ留譜絵目課離根以名阿さ樹他クッカクラ無課課瀬めつ列氏課そ目知屋舳手らへ舳列っに「屋素留御以根」露派差離鵜けきうっ雲目以ナシ。日氏すゅともむ樹留素ふりう氏日夜れとせさ鵜知めっゃ瀬露めゅむに遊雲舳野ひひよやめほくさめう舳名都とにてめは無めもはすにちひ遊モシルもねたらやょや。知以ほ以名さきにまむろせちょったか毛御差巣夜氏、きまむこ列模模阿。 + +阿瀬鵜屋さねや、う他列舳ヤマりれえんか、尾瀬カコノヒ名課巣鵜津せやおひく知二保手、そ派毛遊へろへよ。みす派毛はうよ樹二御派派等メノコせ区さ巣屋名のせ野毛。 \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/page-background.qmd b/_extensions/drwater/dwev/demo/page-background.qmd new file mode 100644 index 0000000..8172385 --- /dev/null +++ b/_extensions/drwater/dwev/demo/page-background.qmd @@ -0,0 +1,60 @@ +--- +title: "Vinaque sanguine metuenti cuiquam Alcyone fixus" +author: [Author Name] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +subtitle: "Aesculeae domus vincemur et Veneris adsuetus lapsum" +lang: "en" +page-background: "inst/page-background/backgrounds/background1.pdf" +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +## Aesculeae domus vincemur et Veneris adsuetus lapsum + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque ab +esse, obstat gravitate. Obscura atque coniuge, per de coniunx, sibi **medias +commentaque virgine** anima tamen comitemque petis, sed. In Amphion vestros +hamos ire arceor mandere spicula, in licet aliquando. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. +Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva virtus! Acrota +destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente +Pirithoi abstulit, lapides. + +## Lydia caelo recenti haerebat lacerum ratae at + +Te concepit pollice fugit vias alumno **oras** quam potest +[rursus](http://example.com#rursus) optat. Non evadere orbem equorum, spatiis, +vel pede inter si. + +1. De neque iura aquis +2. Frangitur gaudia mihi eo umor terrae quos +3. Recens diffudit ille tantum + +\begin{equation}\label{eq:neighbor-propability} + p_{ij}(t) = \frac{\ell_j(t) - \ell_i(t)}{\sum_{k \in N_i(t)}^{} \ell_k(t) - \ell_i(t)} +\end{equation} + +Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae +adessent arbor. Florente perque at condeturque saxa et ferarum promittis tendebat. Armos nisi obortas refugit me. + +Et nepotes poterat, se qui. Euntem ego pater desuetaque aethera Maeandri, et +[Dardanio geminaque](http://example.com#Dardanio_geminaque) cernit. Lassaque poenas +nec, manifesta $\pi r^2$ mirantia captivarum prohibebant scelerato gradus unusque +dura. + +- Permulcens flebile simul +- Iura tum nepotis causa motus diva virtus Acrota. Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae adessent arbor. Florente perque at ire arcum. diff --git a/_extensions/drwater/dwev/demo/table-of-contents.qmd b/_extensions/drwater/dwev/demo/table-of-contents.qmd new file mode 100644 index 0000000..9ff46e1 --- /dev/null +++ b/_extensions/drwater/dwev/demo/table-of-contents.qmd @@ -0,0 +1,60 @@ +--- +title: "Example PDF" +author: [Author] +date: "2022-03-04" +subject: "Markdown" +keywords: [Markdown, Example] +lang: "en" +toc: true +toc-own-page: true +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +## Aesculeae domus vincemur et Veneris adsuetus lapsum + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque ab +esse, obstat gravitate. Obscura atque coniuge, per de coniunx, sibi **medias +commentaque virgine** anima tamen comitemque petis, sed. In Amphion vestros +hamos ire arceor mandere spicula, in licet aliquando. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. +Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva virtus! Acrota +destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente +Pirithoi abstulit, lapides. + +## Lydia caelo recenti haerebat lacerum ratae at + +Te concepit pollice fugit vias alumno **oras** quam potest +[rursus](http://example.com#rursus) optat. Non evadere orbem equorum, spatiis, +vel pede inter si. + +1. De neque iura aquis +2. Frangitur gaudia mihi eo umor terrae quos +3. Recens diffudit ille tantum + +\begin{equation}\label{eq:neighbor-propability} + p_{ij}(t) = \frac{\ell_j(t) - \ell_i(t)}{\sum_{k \in N_i(t)}^{} \ell_k(t) - \ell_i(t)} +\end{equation} + +Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae +adessent arbor. Florente perque at condeturque saxa et ferarum promittis tendebat. Armos nisi obortas refugit me. + +> Et nepotes poterat, se qui. Euntem ego pater desuetaque aethera Maeandri, et +[Dardanio geminaque](http://example.com#Dardanio_geminaque) cernit. Lassaque poenas +nec, manifesta $\pi r^2$ mirantia captivarum prohibebant scelerato gradus unusque +dura. + +- Permulcens flebile simul +- Iura tum nepotis causa motus diva virtus Acrota. Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae adessent arbor. Florente perque at ire arcum. \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/title-page-background.qmd b/_extensions/drwater/dwev/demo/title-page-background.qmd new file mode 100644 index 0000000..15cc07d --- /dev/null +++ b/_extensions/drwater/dwev/demo/title-page-background.qmd @@ -0,0 +1,62 @@ +--- +title: "Vinaque sanguine metuenti cuiquam Alcyone fixus" +author: [Author Name] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +subtitle: "Aesculeae domus vincemur et Veneris adsuetus lapsum" +lang: "en" +titlepage: true, +titlepage-rule-color: "360049" +titlepage-background: "inst/title-page-background/backgrounds/background1.pdf" +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +## Aesculeae domus vincemur et Veneris adsuetus lapsum + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque ab +esse, obstat gravitate. Obscura atque coniuge, per de coniunx, sibi **medias +commentaque virgine** anima tamen comitemque petis, sed. In Amphion vestros +hamos ire arceor mandere spicula, in licet aliquando. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. +Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva virtus! Acrota +destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente +Pirithoi abstulit, lapides. + +## Lydia caelo recenti haerebat lacerum ratae at + +Te concepit pollice fugit vias alumno **oras** quam potest +[rursus](http://example.com#rursus) optat. Non evadere orbem equorum, spatiis, +vel pede inter si. + +1. De neque iura aquis +2. Frangitur gaudia mihi eo umor terrae quos +3. Recens diffudit ille tantum + +\begin{equation}\label{eq:neighbor-propability} + p_{ij}(t) = \frac{\ell_j(t) - \ell_i(t)}{\sum_{k \in N_i(t)}^{} \ell_k(t) - \ell_i(t)} +\end{equation} + +Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae +adessent arbor. Florente perque at condeturque saxa et ferarum promittis tendebat. Armos nisi obortas refugit me. + +Et nepotes poterat, se qui. Euntem ego pater desuetaque aethera Maeandri, et +[Dardanio geminaque](http://example.com#Dardanio_geminaque) cernit. Lassaque poenas +nec, manifesta $\pi r^2$ mirantia captivarum prohibebant scelerato gradus unusque +dura. + +- Permulcens flebile simul +- Iura tum nepotis causa motus diva virtus Acrota. Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae adessent arbor. Florente perque at ire arcum. diff --git a/_extensions/drwater/dwev/demo/title-page-custom.qmd b/_extensions/drwater/dwev/demo/title-page-custom.qmd new file mode 100644 index 0000000..4cad5ba --- /dev/null +++ b/_extensions/drwater/dwev/demo/title-page-custom.qmd @@ -0,0 +1,64 @@ +--- +title: "Vinaque sanguine metuenti cuiquam Alcyone fixus" +author: [Author Name] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +subtitle: "Aesculeae domus vincemur et Veneris adsuetus lapsum" +lang: "en" +titlepage: true, +titlepage-text-color: "FFFFFF" +titlepage-rule-color: "360049" +titlepage-rule-height: 0 +titlepage-background: "inst/title-page-custom/background.pdf" +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +## Aesculeae domus vincemur et Veneris adsuetus lapsum + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque ab +esse, obstat gravitate. Obscura atque coniuge, per de coniunx, sibi **medias +commentaque virgine** anima tamen comitemque petis, sed. In Amphion vestros +hamos ire arceor mandere spicula, in licet aliquando. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. +Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva virtus! Acrota +destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente +Pirithoi abstulit, lapides. + +## Lydia caelo recenti haerebat lacerum ratae at + +Te concepit pollice fugit vias alumno **oras** quam potest +[rursus](http://example.com#rursus) optat. Non evadere orbem equorum, spatiis, +vel pede inter si. + +1. De neque iura aquis +2. Frangitur gaudia mihi eo umor terrae quos +3. Recens diffudit ille tantum + +\begin{equation}\label{eq:neighbor-propability} + p_{ij}(t) = \frac{\ell_j(t) - \ell_i(t)}{\sum_{k \in N_i(t)}^{} \ell_k(t) - \ell_i(t)} +\end{equation} + +Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae +adessent arbor. Florente perque at condeturque saxa et ferarum promittis tendebat. Armos nisi obortas refugit me. + +Et nepotes poterat, se qui. Euntem ego pater desuetaque aethera Maeandri, et +[Dardanio geminaque](http://example.com#Dardanio_geminaque) cernit. Lassaque poenas +nec, manifesta $\pi r^2$ mirantia captivarum prohibebant scelerato gradus unusque +dura. + +- Permulcens flebile simul +- Iura tum nepotis causa motus diva virtus Acrota. Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae adessent arbor. Florente perque at ire arcum. diff --git a/_extensions/drwater/dwev/demo/title-page-default.qmd b/_extensions/drwater/dwev/demo/title-page-default.qmd new file mode 100644 index 0000000..fc33703 --- /dev/null +++ b/_extensions/drwater/dwev/demo/title-page-default.qmd @@ -0,0 +1,60 @@ +--- +title: "Vinaque sanguine metuenti cuiquam Alcyone fixus" +author: [Author Name] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +subtitle: "Aesculeae domus vincemur et Veneris adsuetus lapsum" +lang: "en" +titlepage: true +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +## Aesculeae domus vincemur et Veneris adsuetus lapsum + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque ab +esse, obstat gravitate. Obscura atque coniuge, per de coniunx, sibi **medias +commentaque virgine** anima tamen comitemque petis, sed. In Amphion vestros +hamos ire arceor mandere spicula, in licet aliquando. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. +Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva virtus! Acrota +destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente +Pirithoi abstulit, lapides. + +## Lydia caelo recenti haerebat lacerum ratae at + +Te concepit pollice fugit vias alumno **oras** quam potest +[rursus](http://example.com#rursus) optat. Non evadere orbem equorum, spatiis, +vel pede inter si. + +1. De neque iura aquis +2. Frangitur gaudia mihi eo umor terrae quos +3. Recens diffudit ille tantum + +\begin{equation}\label{eq:neighbor-propability} + p_{ij}(t) = \frac{\ell_j(t) - \ell_i(t)}{\sum_{k \in N_i(t)}^{} \ell_k(t) - \ell_i(t)} +\end{equation} + +Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae +adessent arbor. Florente perque at condeturque saxa et ferarum promittis tendebat. Armos nisi obortas refugit me. + +Et nepotes poterat, se qui. Euntem ego pater desuetaque aethera Maeandri, et +[Dardanio geminaque](http://example.com#Dardanio_geminaque) cernit. Lassaque poenas +nec, manifesta $\pi r^2$ mirantia captivarum prohibebant scelerato gradus unusque +dura. + +- Permulcens flebile simul +- Iura tum nepotis causa motus diva virtus Acrota. Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae adessent arbor. Florente perque at ire arcum. \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/title-page-green.qmd b/_extensions/drwater/dwev/demo/title-page-green.qmd new file mode 100644 index 0000000..2e64412 --- /dev/null +++ b/_extensions/drwater/dwev/demo/title-page-green.qmd @@ -0,0 +1,64 @@ +--- +title: "Vinaque sanguine metuenti cuiquam Alcyone fixus" +author: [Author Name] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +subtitle: "Aesculeae domus vincemur et Veneris adsuetus lapsum" +lang: "en" +titlepage: true +titlepage-color: "3C9F53" +titlepage-text-color: "FFFFFF" +titlepage-rule-color: "FFFFFF" +titlepage-rule-height: 2 +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +## Aesculeae domus vincemur et Veneris adsuetus lapsum + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque ab +esse, obstat gravitate. Obscura atque coniuge, per de coniunx, sibi **medias +commentaque virgine** anima tamen comitemque petis, sed. In Amphion vestros +hamos ire arceor mandere spicula, in licet aliquando. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. +Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva virtus! Acrota +destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente +Pirithoi abstulit, lapides. + +## Lydia caelo recenti haerebat lacerum ratae at + +Te concepit pollice fugit vias alumno **oras** quam potest +[rursus](http://example.com#rursus) optat. Non evadere orbem equorum, spatiis, +vel pede inter si. + +1. De neque iura aquis +2. Frangitur gaudia mihi eo umor terrae quos +3. Recens diffudit ille tantum + +\begin{equation}\label{eq:neighbor-propability} + p_{ij}(t) = \frac{\ell_j(t) - \ell_i(t)}{\sum_{k \in N_i(t)}^{} \ell_k(t) - \ell_i(t)} +\end{equation} + +Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae +adessent arbor. Florente perque at condeturque saxa et ferarum promittis tendebat. Armos nisi obortas refugit me. + +Et nepotes poterat, se qui. Euntem ego pater desuetaque aethera Maeandri, et +[Dardanio geminaque](http://example.com#Dardanio_geminaque) cernit. Lassaque poenas +nec, manifesta $\pi r^2$ mirantia captivarum prohibebant scelerato gradus unusque +dura. + +- Permulcens flebile simul +- Iura tum nepotis causa motus diva virtus Acrota. Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae adessent arbor. Florente perque at ire arcum. \ No newline at end of file diff --git a/_extensions/drwater/dwev/demo/title-page-logo.qmd b/_extensions/drwater/dwev/demo/title-page-logo.qmd new file mode 100644 index 0000000..000cd42 --- /dev/null +++ b/_extensions/drwater/dwev/demo/title-page-logo.qmd @@ -0,0 +1,65 @@ +--- +title: "Vinaque sanguine metuenti cuiquam Alcyone fixus" +author: [Author Name] +date: "2017-02-20" +subject: "Markdown" +keywords: [Markdown, Example] +subtitle: "Aesculeae domus vincemur et Veneris adsuetus lapsum" +lang: "en" +titlepage: true +titlepage-text-color: "7137C8" +titlepage-rule-color: "7137C8" +titlepage-rule-height: 2 +titlepage-logo: "inst/title-page-logo/logo.pdf" +logo-width: 30mm +format: dwev-pdf +--- + +# Vinaque sanguine metuenti cuiquam Alcyone fixus + +## Aesculeae domus vincemur et Veneris adsuetus lapsum + +Lorem markdownum Letoia, et alios: figurae flectentem annis aliquid Peneosque ab +esse, obstat gravitate. Obscura atque coniuge, per de coniunx, sibi **medias +commentaque virgine** anima tamen comitemque petis, sed. In Amphion vestros +hamos ire arceor mandere spicula, in licet aliquando. + +```java +public class Example implements LoremIpsum { + public static void main(String[] args) { + if(args.length < 2) { + System.out.println("Lorem ipsum dolor sit amet"); + } + } // Obscura atque coniuge, per de coniunx +} +``` + +Porrigitur et Pallas nuper longusque cratere habuisse sepulcro pectore fertur. +Laudat ille auditi; vertitur iura tum nepotis causa; motus. Diva virtus! Acrota +destruitis vos iubet quo et classis excessere Scyrumve spiro subitusque mente +Pirithoi abstulit, lapides. + +## Lydia caelo recenti haerebat lacerum ratae at + +Te concepit pollice fugit vias alumno **oras** quam potest +[rursus](http://example.com#rursus) optat. Non evadere orbem equorum, spatiis, +vel pede inter si. + +1. De neque iura aquis +2. Frangitur gaudia mihi eo umor terrae quos +3. Recens diffudit ille tantum + +\begin{equation}\label{eq:neighbor-propability} + p_{ij}(t) = \frac{\ell_j(t) - \ell_i(t)}{\sum_{k \in N_i(t)}^{} \ell_k(t) - \ell_i(t)} +\end{equation} + +Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae +adessent arbor. Florente perque at condeturque saxa et ferarum promittis tendebat. Armos nisi obortas refugit me. + +Et nepotes poterat, se qui. Euntem ego pater desuetaque aethera Maeandri, et +[Dardanio geminaque](http://example.com#Dardanio_geminaque) cernit. Lassaque poenas +nec, manifesta $\pi r^2$ mirantia captivarum prohibebant scelerato gradus unusque +dura. + +- Permulcens flebile simul +- Iura tum nepotis causa motus diva virtus Acrota. Tamen condeturque saxa Pallorque num et ferarum promittis inveni lilia iuvencae adessent arbor. Florente perque at ire arcum. diff --git a/_extensions/drwater/dwev/dweisvogel.tex b/_extensions/drwater/dwev/dweisvogel.tex new file mode 100644 index 0000000..50b9664 --- /dev/null +++ b/_extensions/drwater/dwev/dweisvogel.tex @@ -0,0 +1,1323 @@ +%% +% Copyright (c) 2017 - 2024, Pascal Wagler; +% Copyright (c) 2014 - 2024, John MacFarlane +% +% All rights reserved. +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions +% are met: +% +% - Redistributions of source code must retain the above copyright +% notice, this list of conditions and the following disclaimer. +% +% - Redistributions in binary form must reproduce the above copyright +% notice, this list of conditions and the following disclaimer in the +% documentation and/or other materials provided with the distribution. +% +% - Neither the name of John MacFarlane nor the names of other +% contributors may be used to endorse or promote products derived +% from this software without specific prior written permission. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +% "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +% FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +% COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +% INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +% LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +% ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE. +%% + +%% +% This is the Eisvogel pandoc LaTeX template. +% +% For usage information and examples visit the official GitHub page: +% https://github.com/Wandmalfarbe/pandoc-latex-template +%% + +% Options for packages loaded elsewhere +\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref} +\PassOptionsToPackage{hyphens}{url} +\PassOptionsToPackage{dvipsnames,svgnames,x11names,table}{xcolor} +$if(CJKmainfont)$ +\PassOptionsToPackage{space}{xeCJK} +$endif$ +% +\documentclass[ +$if(fontsize)$ + $fontsize$, +$endif$ +$if(papersize)$ + $papersize$paper, +$else$ + paper=a4, +$endif$ +$if(beamer)$ + ignorenonframetext, +$if(handout)$ + handout, +$endif$ +$if(aspectratio)$ + aspectratio=$aspectratio$, +$endif$ +$if(babel-lang)$ + $babel-lang$, +$endif$ +$endif$ +$for(classoption)$ + $classoption$$sep$, +$endfor$ + ,captions=tableheading +]{$if(beamer)$$documentclass$$else$$if(isbook)$scrbook$else$scrartcl$endif$$endif$} +$if(beamer)$ +$if(background-image)$ +\usebackgroundtemplate{% + \includegraphics[width=\paperwidth]{$background-image$}% +} +% In beamer background-image does not work well when other images are used, so this is the workaround +\pgfdeclareimage[width=\paperwidth,height=\paperheight]{background}{$background-image$} +\usebackgroundtemplate{\pgfuseimage{background}} +$endif$ + +\usepackage{pgfpages} +\setbeamertemplate{caption}[numbered] +\setbeamertemplate{caption label separator}{: } +\setbeamercolor{caption name}{fg=normal text.fg} +\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$ +$for(beameroption)$ +\setbeameroption{$beameroption$} +$endfor$ +% Prevent slide breaks in the middle of a paragraph +\widowpenalties 1 10000 +\raggedbottom +$if(section-titles)$ +\setbeamertemplate{part page}{ + \centering + \begin{beamercolorbox}[sep=16pt,center]{part title} + \usebeamerfont{part title}\insertpart\par + \end{beamercolorbox} +} +\setbeamertemplate{section page}{ + \centering + \begin{beamercolorbox}[sep=12pt,center]{section title} + \usebeamerfont{section title}\insertsection\par + \end{beamercolorbox} +} +\setbeamertemplate{subsection page}{ + \centering + \begin{beamercolorbox}[sep=8pt,center]{subsection title} + \usebeamerfont{subsection title}\insertsubsection\par + \end{beamercolorbox} +} +\AtBeginPart{ + \frame{\partpage} +} +\AtBeginSection{ + \ifbibliography + \else + \frame{\sectionpage} + \fi +} +\AtBeginSubsection{ + \frame{\subsectionpage} +} +$endif$ +$endif$ +$if(beamerarticle)$ +\usepackage{beamerarticle} % needs to be loaded first +$endif$ +\usepackage{amsmath,amssymb} +$if(linestretch)$ +\usepackage{setspace} +$else$ +% Use setspace anyway because we change the default line spacing. +% The spacing is changed early to affect the titlepage and the TOC. +\usepackage{setspace} +\setstretch{1.2} +$endif$ +\usepackage{iftex} +\ifPDFTeX + \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provide euro and other symbols +\else % if luatex or xetex +$if(mathspec)$ + \ifXeTeX + \usepackage{mathspec} % this also loads fontspec + \else + \usepackage{unicode-math} % this also loads fontspec + \fi +$else$ + \usepackage{unicode-math} % this also loads fontspec +$endif$ + \defaultfontfeatures{Scale=MatchLowercase}$-- must come before Beamer theme + \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} +\fi +$if(fontfamily)$ +$else$ +$-- Set default font before Beamer theme so the theme can override it +\usepackage{lmodern} +$endif$ +$-- Set Beamer theme before user font settings so they can override theme +$if(beamer)$ +$if(theme)$ +\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$} +$endif$ +$if(colortheme)$ +\usecolortheme{$colortheme$} +$endif$ +$if(fonttheme)$ +\usefonttheme{$fonttheme$} +$endif$ +$if(mainfont)$ +\usefonttheme{serif} % use mainfont rather than sansfont for slide text +$endif$ +$if(innertheme)$ +\useinnertheme{$innertheme$} +$endif$ +$if(outertheme)$ +\useoutertheme{$outertheme$} +$endif$ +$endif$ +$-- User font settings (must come after default font and Beamer theme) +$if(fontfamily)$ +\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} +$endif$ +\ifPDFTeX\else + % xetex/luatex font selection +$if(mainfont)$ + $if(mainfontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("mainfontfallback",{ + $for(mainfontfallback)$"$mainfontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$} +$endif$ +$if(sansfont)$ + $if(sansfontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("sansfontfallback",{ + $for(sansfontfallback)$"$sansfontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$$if(sansfontfallback)$,RawFeature={fallback=sansfontfallback}$endif$]{$sansfont$} +$endif$ +$if(monofont)$ + $if(monofontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("monofontfallback",{ + $for(monofontfallback)$"$monofontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$if(monofontfallback)$,RawFeature={fallback=monofontfallback}$endif$]{$monofont$} +$endif$ +$for(fontfamilies)$ + \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$} +$endfor$ +$if(mathfont)$ +$if(mathspec)$ + \ifXeTeX + \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \else + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \fi +$else$ + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} +$endif$ +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + \usepackage{xeCJK} + \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + $if(CJKsansfont)$ + \setCJKsansfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKsansfont$} + $endif$ + $if(CJKmonofont)$ + \setCJKmonofont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmonofont$} + $endif$ + \fi +$endif$ +$if(luatexjapresetoptions)$ + \ifLuaTeX + \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset} + \fi +$endif$ +$if(CJKmainfont)$ + \ifLuaTeX + \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec} + \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +\fi +$if(zero-width-non-joiner)$ +%% Support for zero-width non-joiner characters. +\makeatletter +\def\zerowidthnonjoiner{% + % Prevent ligatures and adjust kerning, but still support hyphenating. + \texorpdfstring{% + \TextOrMath{\nobreak\discretionary{-}{}{\kern.03em}% + \ifvmode\else\nobreak\hskip\z@skip\fi}{}% + }{}% +} +\makeatother +\ifPDFTeX + \DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner} +\else + \catcode`^^^^200c=\active + \protected\def ^^^^200c{\zerowidthnonjoiner} +\fi +%% End of ZWNJ support +$endif$ +% Use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\IfFileExists{microtype.sty}{% use microtype if available + \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype} + \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +$if(indent)$ +$else$ +\makeatletter +\@ifundefined{KOMAClassName}{% if non-KOMA class + \IfFileExists{parskip.sty}{% + \usepackage{parskip} + }{% else + \setlength{\parindent}{0pt} + \setlength{\parskip}{6pt plus 2pt minus 1pt}} +}{% if KOMA class + \KOMAoptions{parskip=half}} +\makeatother +$endif$ +$if(verbatim-in-note)$ +\usepackage{fancyvrb} +$endif$ +\usepackage{xcolor} +\definecolor{default-linkcolor}{HTML}{A50000} +\definecolor{default-filecolor}{HTML}{A50000} +\definecolor{default-citecolor}{HTML}{4077C0} +\definecolor{default-urlcolor}{HTML}{4077C0} +$if(footnotes-pretty)$ +% load footmisc in order to customize footnotes (footmisc has to be loaded before hyperref, cf. https://tex.stackexchange.com/a/169124/144087) +\usepackage[hang,flushmargin,bottom,multiple]{footmisc} +\setlength{\footnotemargin}{0.8em} % set space between footnote nr and text +\setlength{\footnotesep}{\baselineskip} % set space between multiple footnotes +\setlength{\skip\footins}{0.3cm} % set space between page content and footnote +\setlength{\footskip}{0.9cm} % set space between footnote and page bottom +$endif$ +$if(geometry)$ +$if(beamer)$ +\geometry{$for(geometry)$$geometry$$sep$,$endfor$} +$else$ +\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$else$ +$if(beamer)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering,$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$endif$ +$if(titlepage-logo)$ +\usepackage[export]{adjustbox} +\usepackage{graphicx} +$endif$ +$if(beamer)$ +\newif\ifbibliography +$endif$ +$if(listings)$ +\usepackage{listings} +\newcommand{\passthrough}[1]{#1} +\lstset{defaultdialect=[5.3]Lua} +\lstset{defaultdialect=[x86masm]Assembler} +$endif$ +$if(listings-no-page-break)$ +\usepackage{etoolbox} +\BeforeBeginEnvironment{lstlisting}{\par\noindent\begin{minipage}{\linewidth}} +\AfterEndEnvironment{lstlisting}{\end{minipage}\par\addvspace{\topskip}} +$endif$ +$if(lhs)$ +\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} +$endif$ +$if(highlighting-macros)$ +$highlighting-macros$ + +% Workaround/bugfix from jannick0. +% See https://github.com/jgm/pandoc/issues/4302#issuecomment-360669013) +% or https://github.com/Wandmalfarbe/pandoc-latex-template/issues/2 +% +% Redefine the verbatim environment 'Highlighting' to break long lines (with +% the help of fvextra). Redefinition is necessary because it is unlikely that +% pandoc includes fvextra in the default template. +\usepackage{fvextra} +\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,fontsize=$if(code-block-font-size)$$code-block-font-size$$else$\small$endif$,commandchars=\\\{\}} + +$endif$ + +% 为中文添加支持 by Ming Su +$if(CJK)$ +$if(isbook)$ +\usepackage{ctex} %调用中文字体宏包 +\usepackage{indentfirst} %调用首行缩进宏包 +\usepackage{ctex} % 确保中文字体支持 +\usepackage{zhnumber} +% 修改 chapter 格式为 "第X章" +% \renewcommand{\chapterformat}{第~\thechapter~章} +% \renewcommand{\chapterformat}{第\zhnumber{\thechapter}章} +\renewcommand{\chaptermarkformat}{第~\zhnumber{\thechapter}~章} +\renewcommand{\chapterformat}{第\zhnumber{\thechapter}章} +\renewcommand*{\chapterlinesformat}[3]{% + \parbox{\linewidth}{\centering #2~\quad~#3} % 居中 + "·" 分隔 + % 或改用冒号分隔: + % \parbox{\linewidth}{\centering #2:#3} +} +\RedeclareSectionCommand[ + beforeskip=1.5em plus 0.5em minus 0.5em, + afterskip=1em plus 0.2em, + font=\large\bfseries +]{section} +\usepackage{zhnumber} % 确保已加载(或直接用 ctex) +% 修改目录中的章节编号为中文 +\addtokomafont{chapterentry}{\normalfont} % 可选:调整目录字体 +\renewcommand*{\chapterformat}{第\zhnumber{\thechapter}章} % 正文标题格式 +\renewcommand*{\chaptermarkformat}{第\zhnumber{\thechapter}章\quad} % 页眉标题格式 +% 关键!覆盖目录中的章节编号 +\renewcommand{\addchaptertocentry}[2]{% + \addtocentrydefault{chapter}{第\zhnumber{#1}章}{#2}% +} +\RedeclareSectionCommand[ + tocentryindent=0pt, + tocentrynumwidth=3.5em % 确保编号区域足够宽 +]{chapter} +$endif$ +$endif$ + +$if(tables)$ +\usepackage{longtable,booktabs,array} +$if(multirow)$ +\usepackage{multirow} +$endif$ +\usepackage{calc} % for calculating minipage widths +$if(beamer)$ +\usepackage{caption} +% Make caption package work with longtable +\makeatletter +\def\fnum@table{\tablename~\thetable} +\makeatother +$else$ +% Correct order of tables after \paragraph or \subparagraph +\usepackage{etoolbox} +\makeatletter +\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} +\makeatother +% Allow footnotes in longtable head/foot +\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} +\makesavenoteenv{longtable} +$endif$ +$endif$ +% add backlinks to footnote references, cf. https://tex.stackexchange.com/questions/302266/make-footnote-clickable-both-ways +$if(footnotes-disable-backlinks)$ +$else$ +\usepackage{footnotebackref} +$endif$ +$if(graphics)$ +\usepackage{graphicx} +\makeatletter +% \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +% \def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +% \makeatother +% % Scale images if necessary, so that they will not overflow the page +% % margins by default, and it is still possible to overwrite the defaults +% % using explicit options in \includegraphics[width, height, ...]{} +% \setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +\newsavebox\pandoc@box +\newcommand*\pandocbounded[1]{% scales image to fit in text height/width + \sbox\pandoc@box{#1}% + \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% + \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% + \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both + \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% + \else\usebox{\pandoc@box}% + \fi% +} +% Set default figure placement to htbp +\makeatletter +\def\fps@figure{htbp} +\makeatother +% \makeatletter Old options from template, replaced with quarto defaults above +% \newsavebox\pandoc@box +% \newcommand*\pandocbounded[1]{% scales image to fit in text height/width +% \sbox\pandoc@box{#1}% +% \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% +% \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% +% \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both +% \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% +% \else\usebox{\pandoc@box}% +% \fi% +% } +% % Set default figure placement to htbp +% % Make use of float-package and set default placement for figures to H. +% % The option H means 'PUT IT HERE' (as opposed to the standard h option which means 'You may put it here if you like'). +% \usepackage{float} +% \floatplacement{figure}{$if(float-placement-figure)$$float-placement-figure$$else$H$endif$} +% \makeatother +$endif$ +$if(svg)$ +\usepackage{svg} +$endif$ +$if(strikeout)$ +$-- also used for underline +\ifLuaTeX + \usepackage{luacolor} + \usepackage[soul]{lua-ul} +\else +\usepackage{soul} +$if(beamer)$ + \makeatletter + \let\HL\hl + \renewcommand\hl{% fix for beamer highlighting + \let\set@color\beamerorig@set@color + \let\reset@color\beamerorig@reset@color + \HL} + \makeatother +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + % soul's \st doesn't work for CJK: + \usepackage{xeCJKfntef} + \renewcommand{\st}[1]{\sout{#1}} + \fi +$endif$ +\fi +$endif$ +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +$if(numbersections)$ +\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$} +$else$ +\setcounter{secnumdepth}{-\maxdimen} % remove section numbering +$endif$ +$if(subfigure)$ +\usepackage{subcaption} +$endif$ +$if(beamer)$ +$else$ +$if(block-headings)$ +% Make \paragraph and \subparagraph free-standing +\makeatletter +\ifx\paragraph\undefined\else + \let\oldparagraph\paragraph + \renewcommand{\paragraph}{ + \@ifstar + \xxxParagraphStar + \xxxParagraphNoStar + } + \newcommand{\xxxParagraphStar}[1]{\oldparagraph*{#1}\mbox{}} + \newcommand{\xxxParagraphNoStar}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else + \let\oldsubparagraph\subparagraph + \renewcommand{\subparagraph}{ + \@ifstar + \xxxSubParagraphStar + \xxxSubParagraphNoStar + } + \newcommand{\xxxSubParagraphStar}[1]{\oldsubparagraph*{#1}\mbox{}} + \newcommand{\xxxSubParagraphNoStar}[1]{\oldsubparagraph{#1}\mbox{}} +\fi +\makeatother +$endif$ +$endif$ +$if(pagestyle)$ +\pagestyle{$pagestyle$} +$endif$ +$if(csl-refs)$ +% definitions for citeproc citations +\NewDocumentCommand\citeproctext{}{} +\NewDocumentCommand\citeproc{mm}{% + \begingroup\def\citeproctext{#2}\cite{#1}\endgroup} +\makeatletter + % allow citations to break across lines + \let\@cite@ofmt\@firstofone + % avoid brackets around text for \cite: + \def\@biblabel#1{} + \def\@cite#1#2{{#1\if@tempswa , #2\fi}} +\makeatother +\newlength{\cslhangindent} +\setlength{\cslhangindent}{1.5em} +\newlength{\csllabelwidth} +\setlength{\csllabelwidth}{3em} +\newenvironment{CSLReferences}[2] % #1 hanging-indent, #2 entry-spacing + {\begin{list}{}{% + \setlength{\itemindent}{0pt} + \setlength{\leftmargin}{0pt} + \setlength{\parsep}{0pt} + % turn on hanging indent if param 1 is 1 + \ifodd #1 + \setlength{\leftmargin}{\cslhangindent} + \setlength{\itemindent}{-1\cslhangindent} + \fi + % set entry spacing + \setlength{\itemsep}{#2\baselineskip}}} + {\end{list}} +\usepackage{calc} +\newcommand{\CSLBlock}[1]{\hfill\break\parbox[t]{\linewidth}{\strut\ignorespaces#1\strut}} +\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{\strut#1\strut}} +\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{\strut#1\strut}} +\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1} +$endif$ +$if(lang)$ +\ifLuaTeX +\usepackage[bidi=basic]{babel} +\else +\usepackage[bidi=default]{babel} +\fi +$if(babel-lang)$ +\babelprovide[main,import]{$babel-lang$} +$if(mainfont)$ +\ifPDFTeX +\else +\babelfont{rm}[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$} +\fi +$endif$ +$endif$ +$for(babel-otherlangs)$ +\babelprovide[import]{$babel-otherlangs$} +$endfor$ +$for(babelfonts/pairs)$ +\babelfont[$babelfonts.key$]{rm}{$babelfonts.value$} +$endfor$ +% get rid of language-specific shorthands (see #6817): +\let\LanguageShortHands\languageshorthands +\def\languageshorthands#1{} +$if(selnolig-langs)$ +\ifLuaTeX + \usepackage[$for(selnolig-langs)$$it$$sep$,$endfor$]{selnolig} % disable illegal ligatures +\fi +$endif$ +$endif$ +$for(header-includes)$ +$header-includes$ +$endfor$ +$if(dir)$ +\ifPDFTeX + \TeXXeTstate=1 + \newcommand{\RL}[1]{\beginR #1\endR} + \newcommand{\LR}[1]{\beginL #1\endL} + \newenvironment{RTL}{\beginR}{\endR} + \newenvironment{LTR}{\beginL}{\endL} +\fi +$endif$ +$if(natbib)$ +\usepackage[$natbiboptions$]{natbib} +\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} +$endif$ +$if(biblatex)$ +\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} +$for(bibliography)$ +\addbibresource{$bibliography$} +$endfor$ +$endif$ +$if(nocite-ids)$ +\nocite{$for(nocite-ids)$$it$$sep$, $endfor$} +$endif$ +$if(csquotes)$ +\usepackage{csquotes} +$endif$ +\usepackage{bookmark} +\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available +\urlstyle{$if(urlstyle)$$urlstyle$$else$same$endif$} +$if(links-as-notes)$ +% Make links footnotes instead of hotlinks: +\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}} +$endif$ +$if(verbatim-in-note)$ +\VerbatimFootnotes % allow verbatim text in footnotes +$endif$ +\hypersetup{ +$if(title-meta)$ + pdftitle={$title-meta$}, +$endif$ +$if(author-meta)$ + pdfauthor={$author-meta$}, +$endif$ +$if(lang)$ + pdflang={$lang$}, +$endif$ +$if(subject)$ +pdfsubject={$subject$}, +$endif$ +$if(keywords)$ + pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$}, +$endif$ +$if(colorlinks)$ + colorlinks=true, + linkcolor={$if(linkcolor)$$linkcolor$$else$default-linkcolor$endif$}, + filecolor={$if(filecolor)$$filecolor$$else$default-filecolor$endif$}, + citecolor={$if(citecolor)$$citecolor$$else$default-citecolor$endif$}, + urlcolor={$if(urlcolor)$$urlcolor$$else$default-urlcolor$endif$}, +$else$ +$if(boxlinks)$ +$else$ + hidelinks, +$endif$ +$endif$ + breaklinks=true, + pdfcreator={LaTeX via pandoc with the Eisvogel template}} +$if(title)$ +\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} +$endif$ +$if(subtitle)$ +$if(beamer)$ +$else$ +\usepackage{etoolbox} +\makeatletter +\providecommand{\subtitle}[1]{% add subtitle to \maketitle + \apptocmd{\@title}{\par {\large #1 \par}}{}{} +} +\makeatother +$endif$ +\subtitle{$subtitle$} +$endif$ +\author{$for(author)$$author$$sep$ \and $endfor$} +\date{$date$} +$if(beamer)$ +$if(institute)$ +\institute{$for(institute)$$institute$$sep$ \and $endfor$} +$endif$ +$if(titlegraphic)$ +\titlegraphic{\includegraphics$if(titlegraphicoptions)$[$for(titlegraphicoptions)$$titlegraphicoptions$$sep$, $endfor$]$endif${$titlegraphic$}} +$endif$ +$if(logo)$ +\logo{\includegraphics{$logo$}} +$endif$ +$endif$ + + + +%% +%% added +%% + +$if(page-background)$ +\usepackage[pages=all]{background} +$endif$ + +% +% for the background color of the title page +% +$if(titlepage)$ +\usepackage{pagecolor} +\usepackage{afterpage} +$if(titlepage-background)$ +\usepackage{tikz} +$endif$ +$if(geometry)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering]{geometry} +$endif$ +$endif$ + +% +% break urls +% +\PassOptionsToPackage{hyphens}{url} + +% +% When using babel or polyglossia with biblatex, loading csquotes is recommended +% to ensure that quoted texts are typeset according to the rules of your main language. +% +\usepackage{csquotes} + +% +% captions +% +\definecolor{caption-color}{HTML}{777777} +$if(beamer)$ +$else$ +\usepackage[font={stretch=1.2}, textfont={color=caption-color}, position=top, skip=4mm, labelfont=bf, singlelinecheck=false, justification=$if(caption-justification)$$caption-justification$$else$raggedright$endif$]{caption} +\setcapindent{0em} +$endif$ + +% +% blockquote +% +\definecolor{blockquote-border}{RGB}{221,221,221} +\definecolor{blockquote-text}{RGB}{119,119,119} +\usepackage{mdframed} +\newmdenv[rightline=false,bottomline=false,topline=false,linewidth=3pt,linecolor=blockquote-border,skipabove=\parskip]{customblockquote} +\renewenvironment{quote}{\begin{customblockquote}\list{}{\rightmargin=0em\leftmargin=0em}% +\item\relax\color{blockquote-text}\ignorespaces}{\unskip\unskip\endlist\end{customblockquote}} + +% +% Source Sans Pro as the default font family +% Source Code Pro for monospace text +% +% 'default' option sets the default +% font family to Source Sans Pro, not \sfdefault. +% +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + $if(fontfamily)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + $endif$ +\else % if not pdftex + $if(mainfont)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + + % XeLaTeX specific adjustments for straight quotes: https://tex.stackexchange.com/a/354887 + % This issue is already fixed (see https://github.com/silkeh/latex-sourcecodepro/pull/5) but the + % fix is still unreleased. + % TODO: Remove this workaround when the new version of sourcecodepro is released on CTAN. + \ifxetex + \makeatletter + \defaultfontfeatures[\ttfamily] + { Numbers = \sourcecodepro@figurestyle, + Scale = \SourceCodePro@scale, + Extension = .otf } + \setmonofont + [ UprightFont = *-\sourcecodepro@regstyle, + ItalicFont = *-\sourcecodepro@regstyle It, + BoldFont = *-\sourcecodepro@boldstyle, + BoldItalicFont = *-\sourcecodepro@boldstyle It ] + {SourceCodePro} + \makeatother + \fi + $endif$ +\fi + + +% setup for chinese font, by Ming +\setCJKmainfont{$CJKmainfont$}[BoldFont=$CJKboldfont$, ItalicFont=$CJKitalicfont$] + +% +% heading color +% +\definecolor{heading-color}{RGB}{40,40,40} +$if(beamer)$ +$else$ +\addtokomafont{section}{\color{heading-color}} +$endif$ +% When using the classes report, scrreprt, book, +% scrbook or memoir, uncomment the following line. +%\addtokomafont{chapter}{\color{heading-color}} + +% +% variables for title, author and date +% +$if(beamer)$ +$else$ +\usepackage{titling} +\title{$title$} +\author{$for(author)$$author$$sep$, $endfor$} +\date{$date$} +$endif$ + +% +% tables +% +$if(tables)$ + +\definecolor{table-row-color}{HTML}{F5F5F5} +\definecolor{table-rule-color}{HTML}{999999} + +%\arrayrulecolor{black!40} +\arrayrulecolor{table-rule-color} % color of \toprule, \midrule, \bottomrule +\setlength\heavyrulewidth{0.3ex} % thickness of \toprule, \bottomrule +\renewcommand{\arraystretch}{1.3} % spacing (padding) + +$if(table-use-row-colors)$ +% Unfortunately the colored cells extend beyond the edge of the +% table because pandoc uses @-expressions (@{}) like so: +% +% \begin{longtable}[]{@{}ll@{}} +% \end{longtable} +% +% https://en.wikibooks.org/wiki/LaTeX/Tables#.40-expressions +\usepackage{etoolbox} +\AtBeginEnvironment{longtable}{\rowcolors{2}{}{table-row-color!100}} +\preto{\toprule}{\hiderowcolors}{}{} +\appto{\endhead}{\showrowcolors}{}{} +\appto{\endfirsthead}{\showrowcolors}{}{} +$endif$ +$endif$ + +% +% remove paragraph indentation +% +% \setlength{\parindent}{0pt} +$if(parindent)$ +\setlength{\parindent}{2em} %设置首行缩进为2字符 +$else$ +\setlength{\parindent}{0pt} +$endif$ +\setlength{\parskip}{6pt plus 2pt minus 1pt} +\setlength{\emergencystretch}{3em} % prevent overfull lines + + + +% +% +% Listings +% +% + +$if(listings)$ + +% +% general listing colors +% +\definecolor{listing-background}{HTML}{F7F7F7} +\definecolor{listing-rule}{HTML}{B3B2B3} +\definecolor{listing-numbers}{HTML}{B3B2B3} +\definecolor{listing-text-color}{HTML}{000000} +\definecolor{listing-keyword}{HTML}{435489} +\definecolor{listing-keyword-2}{HTML}{1284CA} % additional keywords +\definecolor{listing-keyword-3}{HTML}{9137CB} % additional keywords +\definecolor{listing-identifier}{HTML}{435489} +\definecolor{listing-string}{HTML}{00999A} +\definecolor{listing-comment}{HTML}{8E8E8E} + +\lstdefinestyle{eisvogel_listing_style}{ + language = java, +$if(listings-disable-line-numbers)$ + xleftmargin = 0.6em, + framexleftmargin = 0.4em, +$else$ + numbers = left, + xleftmargin = 2.7em, + framexleftmargin = 2.5em, +$endif$ + backgroundcolor = \color{listing-background}, + basicstyle = \color{listing-text-color}\linespread{1.0}% + \lst@ifdisplaystyle% + $if(code-block-font-size)$$code-block-font-size$$else$\small$endif$% + \fi\ttfamily{}, + breaklines = true, + frame = single, + framesep = 0.19em, + rulecolor = \color{listing-rule}, + frameround = ffff, + tabsize = 4, + numberstyle = \color{listing-numbers}, + aboveskip = 1.0em, + belowskip = 0.1em, + abovecaptionskip = 0em, + belowcaptionskip = 1.0em, + keywordstyle = {\color{listing-keyword}\bfseries}, + keywordstyle = {[2]\color{listing-keyword-2}\bfseries}, + keywordstyle = {[3]\color{listing-keyword-3}\bfseries\itshape}, + sensitive = true, + identifierstyle = \color{listing-identifier}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + showstringspaces = false, + escapeinside = {/*@}{@*/}, % Allow LaTeX inside these special comments + literate = + {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 + {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 + {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 + {À}{{\`A}}1 {È}{{\`E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 + {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1 + {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1 + {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1 + {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1 + {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1 + {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1 + {€}{{\EUR}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1 + {»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1 + {…}{{\ldots}}1 {≥}{{>=}}1 {≤}{{<=}}1 {„}{{\glqq}}1 {“}{{\grqq}}1 + {”}{{''}}1 +} +\lstset{style=eisvogel_listing_style} + +% +% Java (Java SE 12, 2019-06-22) +% +\lstdefinelanguage{Java}{ + morekeywords={ + % normal keywords (without data types) + abstract,assert,break,case,catch,class,continue,default, + do,else,enum,exports,extends,final,finally,for,if,implements, + import,instanceof,interface,module,native,new,package,private, + protected,public,requires,return,static,strictfp,super,switch, + synchronized,this,throw,throws,transient,try,volatile,while, + % var is an identifier + var + }, + morekeywords={[2] % data types + % primitive data types + boolean,byte,char,double,float,int,long,short, + % String + String, + % primitive wrapper types + Boolean,Byte,Character,Double,Float,Integer,Long,Short + % number types + Number,AtomicInteger,AtomicLong,BigDecimal,BigInteger,DoubleAccumulator,DoubleAdder,LongAccumulator,LongAdder,Short, + % other + Object,Void,void + }, + morekeywords={[3] % literals + % reserved words for literal values + null,true,false, + }, + sensitive, + morecomment = [l]//, + morecomment = [s]{/*}{*/}, + morecomment = [s]{/**}{*/}, + morestring = [b]", + morestring = [b]', +} + +\lstdefinelanguage{XML}{ + morestring = [b]", + moredelim = [s][\bfseries\color{listing-keyword}]{<}{\ }, + moredelim = [s][\bfseries\color{listing-keyword}]{}, + moredelim = [l][\bfseries\color{listing-keyword}]{/>}, + moredelim = [l][\bfseries\color{listing-keyword}]{>}, + morecomment = [s]{}, + morecomment = [s]{}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + identifierstyle = \color{listing-identifier} +} +$endif$ + +% +% header and footer +% +$if(beamer)$ +$else$ +$if(disable-header-and-footer)$ +$else$ +\usepackage[headsepline,footsepline]{scrlayer-scrpage} + +\newpairofpagestyles{eisvogel-header-footer}{ + \clearpairofpagestyles + \ihead*{$if(header-left)$$header-left$$else$$title$$endif$} + \chead*{$if(header-center)$$header-center$$else$$endif$} + \ohead*{$if(header-right)$$header-right$$else$$date$$endif$} + \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot*{$if(footer-center)$$footer-center$$else$$endif$} + \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \addtokomafont{pageheadfoot}{\upshape} +} +\pagestyle{eisvogel-header-footer} + +\newpairofpagestyles{eisvogel-chapterpage-header-footer}{ + \clearpairofpagestyles + \setheadtopline{0pt} % 移除页眉顶部的横线(如果有) + \setheadsepline{0pt} + \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot*{$if(footer-center)$$footer-center$$else$$endif$} + \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \addtokomafont{pageheadfoot}{\upshape} +} + + +$if(isbook)$ +% \deftripstyle{ChapterStyle}{}{}{}{}{\pagemark}{} +% \renewcommand*{\chapterpagestyle}{ChapterStyle} +\renewcommand*{\chapterpagestyle}{eisvogel-chapterpage-header-footer} +$endif$ + + +$if(page-background)$ +\backgroundsetup{ +scale=1, +color=black, +opacity=$if(page-background-opacity)$$page-background-opacity$$else$0.2$endif$, +angle=0, +contents={% + \includegraphics[width=\paperwidth,height=\paperheight]{$page-background$} + }% +} +$endif$ +$endif$ +$endif$ + +% watermark +$if(watermark)$ +\usepackage{draftwatermark,xcolor} +\SetWatermarkText{\textcolor{$if(watermark-color)$$watermark-color$$else$gray!3$endif$}{$watermark$}} +\SetWatermarkScale{1.2} % 缩小水印尺寸(数值越小越密集) +\SetWatermarkAngle{45} % 斜角排列(经典水印样式) +\SetWatermarkLightness{0.99} % 亮度调节 +$endif$ + +%% +%% end added +%% + +\begin{document} + +%% +%% begin titlepage +%% +$if(beamer)$ +$else$ +$if(titlepage)$ +\begin{titlepage} +$if(titlepage-background)$ +\newgeometry{top=2cm, right=4cm, bottom=3cm, left=4cm} +$else$ +\newgeometry{left=2cm} +$endif$ +$if(titlepage-color)$ +\definecolor{titlepage-color}{HTML}{$titlepage-color$} +\newpagecolor{titlepage-color}\afterpage{\restorepagecolor} +$endif$ +$if(titlepage-background)$ +\tikz[remember picture,overlay] \node[inner sep=0pt] at (current page.center){\includegraphics[width=\paperwidth,height=\paperheight]{$titlepage-background$}}; +$endif$ +\newcommand{\colorRule}[3][black]{\textcolor[HTML]{#1}{\rule{#2}{#3}}} + +\NewDocumentEnvironment{dynalign}{} + {\begin{$if(titlepage-halign)$$titlepage-halign$$else$center$endif$}} + {\end{$if(titlepage-halign)$$titlepage-halign$$else$center$endif$}} + +\begin{dynalign} +\noindent +\\[-1em] +\color[HTML]{$if(titlepage-text-color)$$titlepage-text-color$$else$5F5F5F$endif$} +\makebox[0pt][l]{\colorRule[$if(titlepage-rule-color)$$titlepage-rule-color$$else$435488$endif$]{1.3\textwidth}{$if(titlepage-rule-height)$$titlepage-rule-height$$else$4$endif$pt}} +\par +\noindent + +$if(titlepage-logo)$ +\noindent +\vskip $if(logo-vskip)$$logo-vskip$$else$-8em$endif$ +\hskip $if(logo-hskip)$$logo-hskip$$else$-6em$endif$ +\includegraphics[width=$if(logo-width)$$logo-width$$else$35mm$endif$, left]{$titlepage-logo$} +$endif$ + +$if(titlepage-background)$ +% The titlepage with a background image has other text spacing and text size +{ + \setstretch{2} + \vfill + \vskip -8em + $if(title-vskip)$ + \vskip $title-vskip$ + $endif$ + $if(title-hskip)$ + \vskip $title-hskip$ + $endif$ + \noindent { + $if(title-size)$ + \$title-size$ + $else$ + \huge + $endif$ +\textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + { + $if(subtitle-size)$ + \$subtitle-size$ + $else$ + \Large + $endif$ + \textsf{$subtitle$}} + $endif$ + \vskip 2em + $if(author-vskip)$ + \vskip $author-vskip$ + $endif$ + \noindent { + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ + +\textsf{$for(author)$$author$$sep$, $endfor$} +\vskip 0.6em + $if(date-vskip)$ + \vskip $date-vskip$ + $endif$ +{\textsf{$if(institute)$$institute$\vskip 0.6em$endif$$date$}} +} + \vfill +} +$else$ +{ + \setstretch{1.4} + \vfill + \vskip 8em + $if(title-vskip)$ + \vskip $title-vskip$ + $endif$ + $if(title-hskip)$ + \vskip $title-hskip$ + $endif$ + \noindent {\huge \textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + {\Large \textsf{$subtitle$}} + $endif$ + \vskip 4em + $if(author-vskip)$ + \vskip $author-vskip$ + $endif$ + \noindent { + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ + +\textsf{$for(author)$$author$$sep$, $endfor$} +\vskip 0.6em + $if(date-vskip)$ + \vskip $date-vskip$ + $endif$ +} + \vfill +} +$endif$ + + +$if(titlepage-background)$ +$else$ + + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ +{\textsf{$if(institute)$$institute$\vskip 0.6em$endif$$date$}} +$endif$ +\end{dynalign} +\end{titlepage} +\restoregeometry +\pagenumbering{arabic} +$endif$ +$endif$ + + + +%% +%% end titlepage +%% + +$if(has-frontmatter)$ +\frontmatter +$endif$ +$if(title)$ +$if(beamer)$ +\frame{\titlepage} +% don't generate the default title +% $else$ +% \maketitle +$endif$ +$if(abstract)$ +\begin{abstract} +$abstract$ +\end{abstract} +$endif$ +$endif$ + +$if(first-chapter)$ +\setcounter{chapter}{$first-chapter$} +\addtocounter{chapter}{-1} +$endif$ + +$for(include-before)$ +$include-before$ + +$endfor$ +$if(toc)$ +$if(toc-title)$ +\renewcommand*\contentsname{$toc-title$} +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks] +$if(toc-title)$ + \frametitle{$toc-title$} +$endif$ + \setcounter{tocdepth}{$toc-depth$} + \tableofcontents +\end{frame} +$if(toc-own-page)$ +\newpage +$endif$ +$else$ +{ +$if(colorlinks)$ +\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$} +$endif$ +\setcounter{tocdepth}{$toc-depth$} +\tableofcontents +$if(toc-own-page)$ +\newpage +$endif$ +} +$endif$ +$endif$ +$if(lof)$ +\listoffigures +$endif$ +$if(lot)$ +\listoftables +$endif$ +$if(linestretch)$ +\setstretch{$linestretch$} +$endif$ +$if(has-frontmatter)$ +\mainmatter +$endif$ +$body$ + +$if(has-frontmatter)$ +\backmatter +$endif$ +$if(natbib)$ +$if(bibliography)$ +$if(biblio-title)$ +$if(has-chapters)$ +\renewcommand\bibname{$biblio-title$} +$else$ +\renewcommand\refname{$biblio-title$} +$endif$ +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue +$endif$ + \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} +$if(beamer)$ +\end{frame} +$endif$ + +$endif$ +$endif$ +$if(biblatex)$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue + \printbibliography[heading=none] +\end{frame} +$else$ +\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ +$endif$ + +$endif$ +$for(include-after)$ +$include-after$ + +$endfor$ +\end{document} diff --git a/_extensions/drwater/dwev/inst/CL.docx b/_extensions/drwater/dwev/inst/CL.docx new file mode 100755 index 0000000..3727b07 Binary files /dev/null and b/_extensions/drwater/dwev/inst/CL.docx differ diff --git a/_extensions/drwater/dwev/inst/MS.docx b/_extensions/drwater/dwev/inst/MS.docx new file mode 100755 index 0000000..5b9ad12 Binary files /dev/null and b/_extensions/drwater/dwev/inst/MS.docx differ diff --git a/_extensions/drwater/dwev/inst/RN.docx b/_extensions/drwater/dwev/inst/RN.docx new file mode 100755 index 0000000..a74403c Binary files /dev/null and b/_extensions/drwater/dwev/inst/RN.docx differ diff --git a/_extensions/drwater/dwev/inst/RP.docx b/_extensions/drwater/dwev/inst/RP.docx new file mode 100755 index 0000000..18580b1 Binary files /dev/null and b/_extensions/drwater/dwev/inst/RP.docx differ diff --git a/_extensions/drwater/dwev/inst/american-chemical-society.csl b/_extensions/drwater/dwev/inst/american-chemical-society.csl new file mode 100755 index 0000000..01f8c49 --- /dev/null +++ b/_extensions/drwater/dwev/inst/american-chemical-society.csl @@ -0,0 +1,280 @@ + + diff --git a/_extensions/drwater/dwev/inst/china-national-standard-gb-t-7714-2015-numeric.csl b/_extensions/drwater/dwev/inst/china-national-standard-gb-t-7714-2015-numeric.csl new file mode 100755 index 0000000..f7c84f0 --- /dev/null +++ b/_extensions/drwater/dwev/inst/china-national-standard-gb-t-7714-2015-numeric.csl @@ -0,0 +1,435 @@ + + diff --git a/_extensions/drwater/dwev/inst/cover1.pdf b/_extensions/drwater/dwev/inst/cover1.pdf new file mode 100644 index 0000000..9111c08 Binary files /dev/null and b/_extensions/drwater/dwev/inst/cover1.pdf differ diff --git a/_extensions/drwater/dwev/inst/cover2.pdf b/_extensions/drwater/dwev/inst/cover2.pdf new file mode 100644 index 0000000..7b8b2a1 Binary files /dev/null and b/_extensions/drwater/dwev/inst/cover2.pdf differ diff --git a/_extensions/drwater/dwev/inst/cover3.pdf b/_extensions/drwater/dwev/inst/cover3.pdf new file mode 100644 index 0000000..4bc55bf Binary files /dev/null and b/_extensions/drwater/dwev/inst/cover3.pdf differ diff --git a/_extensions/drwater/dwev/inst/cover4.pdf b/_extensions/drwater/dwev/inst/cover4.pdf new file mode 100644 index 0000000..2eaf27f Binary files /dev/null and b/_extensions/drwater/dwev/inst/cover4.pdf differ diff --git a/_extensions/drwater/dwev/inst/covers.pdf b/_extensions/drwater/dwev/inst/covers.pdf new file mode 100644 index 0000000..845d1f0 Binary files /dev/null and b/_extensions/drwater/dwev/inst/covers.pdf differ diff --git a/_extensions/drwater/dwev/inst/covers.pptx b/_extensions/drwater/dwev/inst/covers.pptx new file mode 100644 index 0000000..0bcbfab Binary files /dev/null and b/_extensions/drwater/dwev/inst/covers.pptx differ diff --git a/_extensions/drwater/dwev/inst/drwater-gray1.pdf b/_extensions/drwater/dwev/inst/drwater-gray1.pdf new file mode 100644 index 0000000..7fa9b94 Binary files /dev/null and b/_extensions/drwater/dwev/inst/drwater-gray1.pdf differ diff --git a/_extensions/drwater/dwev/inst/drwater-gray1.svg b/_extensions/drwater/dwev/inst/drwater-gray1.svg new file mode 100644 index 0000000..68a8fc9 --- /dev/null +++ b/_extensions/drwater/dwev/inst/drwater-gray1.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/inst/drwater-green0.pdf b/_extensions/drwater/dwev/inst/drwater-green0.pdf new file mode 100644 index 0000000..88b7fda Binary files /dev/null and b/_extensions/drwater/dwev/inst/drwater-green0.pdf differ diff --git a/_extensions/drwater/dwev/inst/drwater-green0.svg b/_extensions/drwater/dwev/inst/drwater-green0.svg new file mode 100644 index 0000000..00fe227 --- /dev/null +++ b/_extensions/drwater/dwev/inst/drwater-green0.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/inst/drwater-green1.pdf b/_extensions/drwater/dwev/inst/drwater-green1.pdf new file mode 100644 index 0000000..091548e Binary files /dev/null and b/_extensions/drwater/dwev/inst/drwater-green1.pdf differ diff --git a/_extensions/drwater/dwev/inst/drwater-green1.svg b/_extensions/drwater/dwev/inst/drwater-green1.svg new file mode 100644 index 0000000..b6990aa --- /dev/null +++ b/_extensions/drwater/dwev/inst/drwater-green1.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/inst/drwater-greenline0.pdf b/_extensions/drwater/dwev/inst/drwater-greenline0.pdf new file mode 100644 index 0000000..86786fa Binary files /dev/null and b/_extensions/drwater/dwev/inst/drwater-greenline0.pdf differ diff --git a/_extensions/drwater/dwev/inst/drwater-greenline0.svg b/_extensions/drwater/dwev/inst/drwater-greenline0.svg new file mode 100644 index 0000000..7eec8c8 --- /dev/null +++ b/_extensions/drwater/dwev/inst/drwater-greenline0.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/inst/drwater-white0.pdf b/_extensions/drwater/dwev/inst/drwater-white0.pdf new file mode 100644 index 0000000..ca69ef8 Binary files /dev/null and b/_extensions/drwater/dwev/inst/drwater-white0.pdf differ diff --git a/_extensions/drwater/dwev/inst/drwater-white0.svg b/_extensions/drwater/dwev/inst/drwater-white0.svg new file mode 100644 index 0000000..0a12a38 --- /dev/null +++ b/_extensions/drwater/dwev/inst/drwater-white0.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/inst/drwater.css b/_extensions/drwater/dwev/inst/drwater.css new file mode 100755 index 0000000..0bbdcff --- /dev/null +++ b/_extensions/drwater/dwev/inst/drwater.css @@ -0,0 +1,109 @@ +.udot { + text-decoration-line: underline; + text-decoration-color: rgb(50, 50, 50); + text-decoration-style: dashed; + text-decoration-thickness: 1px; +} + +.good { + background-color: forestgreen; + color: lightyellow; +} + +.bad { + background-color: orangered; + color: lightyellow; +} + +.del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.5px; +} + + +.todo { + background-color: darkorange; + color: lightyellow; +} + +.com { + background-color: #0025ff; + font-weight: bold; + color: lightyellow; +} + +.add { + text-decoration-line: underline; + text-decoration-color: rgb(222 13 13); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + + +del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.0px; +} + + +ins { + text-decoration-color: rgb(222 93 93); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + +.clab { + background-color: rgb(255, 245, 240); +} + +.rem { + background-color: darkorange; + color: lightyellow; + text-decoration-thickness: 2px; +} + + +#criticnav { + position: fixed; + z-index: 1100; + top: 0; + right: 0; + width: 120px; + border-bottom: solid 1px #ffffff; + margin: 0; + padding: 10; + background-color: rgb(143 38 38 / 95%); + color: #ffffff; + font-size: 12px; + font-family: "Helvetica Neue", helvetica, arial, sans-serif !important +} + +#criticnav ul { + list-style-type: none; + width: 90%; + margin: 0 auto; + padding: 0 +} + +#criticnav ul li { + display: block; + width: 100px; + min-width: 80px; + text-align: center; + padding: 5px 0 3px !important; + margin: 5px 2px !important; + line-height: 1em; + float: center; + text-transform: uppercase; + cursor: pointer; + border-radius: 20px; + border: 3px solid rgba(255,255,255,0); + color: #fff !important +} + diff --git a/_extensions/drwater/dwev/inst/dweisvogel.tex b/_extensions/drwater/dwev/inst/dweisvogel.tex new file mode 100644 index 0000000..50b9664 --- /dev/null +++ b/_extensions/drwater/dwev/inst/dweisvogel.tex @@ -0,0 +1,1323 @@ +%% +% Copyright (c) 2017 - 2024, Pascal Wagler; +% Copyright (c) 2014 - 2024, John MacFarlane +% +% All rights reserved. +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions +% are met: +% +% - Redistributions of source code must retain the above copyright +% notice, this list of conditions and the following disclaimer. +% +% - Redistributions in binary form must reproduce the above copyright +% notice, this list of conditions and the following disclaimer in the +% documentation and/or other materials provided with the distribution. +% +% - Neither the name of John MacFarlane nor the names of other +% contributors may be used to endorse or promote products derived +% from this software without specific prior written permission. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +% "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +% FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +% COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +% INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +% LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +% ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE. +%% + +%% +% This is the Eisvogel pandoc LaTeX template. +% +% For usage information and examples visit the official GitHub page: +% https://github.com/Wandmalfarbe/pandoc-latex-template +%% + +% Options for packages loaded elsewhere +\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref} +\PassOptionsToPackage{hyphens}{url} +\PassOptionsToPackage{dvipsnames,svgnames,x11names,table}{xcolor} +$if(CJKmainfont)$ +\PassOptionsToPackage{space}{xeCJK} +$endif$ +% +\documentclass[ +$if(fontsize)$ + $fontsize$, +$endif$ +$if(papersize)$ + $papersize$paper, +$else$ + paper=a4, +$endif$ +$if(beamer)$ + ignorenonframetext, +$if(handout)$ + handout, +$endif$ +$if(aspectratio)$ + aspectratio=$aspectratio$, +$endif$ +$if(babel-lang)$ + $babel-lang$, +$endif$ +$endif$ +$for(classoption)$ + $classoption$$sep$, +$endfor$ + ,captions=tableheading +]{$if(beamer)$$documentclass$$else$$if(isbook)$scrbook$else$scrartcl$endif$$endif$} +$if(beamer)$ +$if(background-image)$ +\usebackgroundtemplate{% + \includegraphics[width=\paperwidth]{$background-image$}% +} +% In beamer background-image does not work well when other images are used, so this is the workaround +\pgfdeclareimage[width=\paperwidth,height=\paperheight]{background}{$background-image$} +\usebackgroundtemplate{\pgfuseimage{background}} +$endif$ + +\usepackage{pgfpages} +\setbeamertemplate{caption}[numbered] +\setbeamertemplate{caption label separator}{: } +\setbeamercolor{caption name}{fg=normal text.fg} +\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$ +$for(beameroption)$ +\setbeameroption{$beameroption$} +$endfor$ +% Prevent slide breaks in the middle of a paragraph +\widowpenalties 1 10000 +\raggedbottom +$if(section-titles)$ +\setbeamertemplate{part page}{ + \centering + \begin{beamercolorbox}[sep=16pt,center]{part title} + \usebeamerfont{part title}\insertpart\par + \end{beamercolorbox} +} +\setbeamertemplate{section page}{ + \centering + \begin{beamercolorbox}[sep=12pt,center]{section title} + \usebeamerfont{section title}\insertsection\par + \end{beamercolorbox} +} +\setbeamertemplate{subsection page}{ + \centering + \begin{beamercolorbox}[sep=8pt,center]{subsection title} + \usebeamerfont{subsection title}\insertsubsection\par + \end{beamercolorbox} +} +\AtBeginPart{ + \frame{\partpage} +} +\AtBeginSection{ + \ifbibliography + \else + \frame{\sectionpage} + \fi +} +\AtBeginSubsection{ + \frame{\subsectionpage} +} +$endif$ +$endif$ +$if(beamerarticle)$ +\usepackage{beamerarticle} % needs to be loaded first +$endif$ +\usepackage{amsmath,amssymb} +$if(linestretch)$ +\usepackage{setspace} +$else$ +% Use setspace anyway because we change the default line spacing. +% The spacing is changed early to affect the titlepage and the TOC. +\usepackage{setspace} +\setstretch{1.2} +$endif$ +\usepackage{iftex} +\ifPDFTeX + \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provide euro and other symbols +\else % if luatex or xetex +$if(mathspec)$ + \ifXeTeX + \usepackage{mathspec} % this also loads fontspec + \else + \usepackage{unicode-math} % this also loads fontspec + \fi +$else$ + \usepackage{unicode-math} % this also loads fontspec +$endif$ + \defaultfontfeatures{Scale=MatchLowercase}$-- must come before Beamer theme + \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} +\fi +$if(fontfamily)$ +$else$ +$-- Set default font before Beamer theme so the theme can override it +\usepackage{lmodern} +$endif$ +$-- Set Beamer theme before user font settings so they can override theme +$if(beamer)$ +$if(theme)$ +\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$} +$endif$ +$if(colortheme)$ +\usecolortheme{$colortheme$} +$endif$ +$if(fonttheme)$ +\usefonttheme{$fonttheme$} +$endif$ +$if(mainfont)$ +\usefonttheme{serif} % use mainfont rather than sansfont for slide text +$endif$ +$if(innertheme)$ +\useinnertheme{$innertheme$} +$endif$ +$if(outertheme)$ +\useoutertheme{$outertheme$} +$endif$ +$endif$ +$-- User font settings (must come after default font and Beamer theme) +$if(fontfamily)$ +\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} +$endif$ +\ifPDFTeX\else + % xetex/luatex font selection +$if(mainfont)$ + $if(mainfontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("mainfontfallback",{ + $for(mainfontfallback)$"$mainfontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$} +$endif$ +$if(sansfont)$ + $if(sansfontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("sansfontfallback",{ + $for(sansfontfallback)$"$sansfontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$$if(sansfontfallback)$,RawFeature={fallback=sansfontfallback}$endif$]{$sansfont$} +$endif$ +$if(monofont)$ + $if(monofontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("monofontfallback",{ + $for(monofontfallback)$"$monofontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$if(monofontfallback)$,RawFeature={fallback=monofontfallback}$endif$]{$monofont$} +$endif$ +$for(fontfamilies)$ + \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$} +$endfor$ +$if(mathfont)$ +$if(mathspec)$ + \ifXeTeX + \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \else + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \fi +$else$ + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} +$endif$ +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + \usepackage{xeCJK} + \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + $if(CJKsansfont)$ + \setCJKsansfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKsansfont$} + $endif$ + $if(CJKmonofont)$ + \setCJKmonofont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmonofont$} + $endif$ + \fi +$endif$ +$if(luatexjapresetoptions)$ + \ifLuaTeX + \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset} + \fi +$endif$ +$if(CJKmainfont)$ + \ifLuaTeX + \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec} + \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +\fi +$if(zero-width-non-joiner)$ +%% Support for zero-width non-joiner characters. +\makeatletter +\def\zerowidthnonjoiner{% + % Prevent ligatures and adjust kerning, but still support hyphenating. + \texorpdfstring{% + \TextOrMath{\nobreak\discretionary{-}{}{\kern.03em}% + \ifvmode\else\nobreak\hskip\z@skip\fi}{}% + }{}% +} +\makeatother +\ifPDFTeX + \DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner} +\else + \catcode`^^^^200c=\active + \protected\def ^^^^200c{\zerowidthnonjoiner} +\fi +%% End of ZWNJ support +$endif$ +% Use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\IfFileExists{microtype.sty}{% use microtype if available + \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype} + \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +$if(indent)$ +$else$ +\makeatletter +\@ifundefined{KOMAClassName}{% if non-KOMA class + \IfFileExists{parskip.sty}{% + \usepackage{parskip} + }{% else + \setlength{\parindent}{0pt} + \setlength{\parskip}{6pt plus 2pt minus 1pt}} +}{% if KOMA class + \KOMAoptions{parskip=half}} +\makeatother +$endif$ +$if(verbatim-in-note)$ +\usepackage{fancyvrb} +$endif$ +\usepackage{xcolor} +\definecolor{default-linkcolor}{HTML}{A50000} +\definecolor{default-filecolor}{HTML}{A50000} +\definecolor{default-citecolor}{HTML}{4077C0} +\definecolor{default-urlcolor}{HTML}{4077C0} +$if(footnotes-pretty)$ +% load footmisc in order to customize footnotes (footmisc has to be loaded before hyperref, cf. https://tex.stackexchange.com/a/169124/144087) +\usepackage[hang,flushmargin,bottom,multiple]{footmisc} +\setlength{\footnotemargin}{0.8em} % set space between footnote nr and text +\setlength{\footnotesep}{\baselineskip} % set space between multiple footnotes +\setlength{\skip\footins}{0.3cm} % set space between page content and footnote +\setlength{\footskip}{0.9cm} % set space between footnote and page bottom +$endif$ +$if(geometry)$ +$if(beamer)$ +\geometry{$for(geometry)$$geometry$$sep$,$endfor$} +$else$ +\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$else$ +$if(beamer)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering,$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$endif$ +$if(titlepage-logo)$ +\usepackage[export]{adjustbox} +\usepackage{graphicx} +$endif$ +$if(beamer)$ +\newif\ifbibliography +$endif$ +$if(listings)$ +\usepackage{listings} +\newcommand{\passthrough}[1]{#1} +\lstset{defaultdialect=[5.3]Lua} +\lstset{defaultdialect=[x86masm]Assembler} +$endif$ +$if(listings-no-page-break)$ +\usepackage{etoolbox} +\BeforeBeginEnvironment{lstlisting}{\par\noindent\begin{minipage}{\linewidth}} +\AfterEndEnvironment{lstlisting}{\end{minipage}\par\addvspace{\topskip}} +$endif$ +$if(lhs)$ +\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} +$endif$ +$if(highlighting-macros)$ +$highlighting-macros$ + +% Workaround/bugfix from jannick0. +% See https://github.com/jgm/pandoc/issues/4302#issuecomment-360669013) +% or https://github.com/Wandmalfarbe/pandoc-latex-template/issues/2 +% +% Redefine the verbatim environment 'Highlighting' to break long lines (with +% the help of fvextra). Redefinition is necessary because it is unlikely that +% pandoc includes fvextra in the default template. +\usepackage{fvextra} +\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,fontsize=$if(code-block-font-size)$$code-block-font-size$$else$\small$endif$,commandchars=\\\{\}} + +$endif$ + +% 为中文添加支持 by Ming Su +$if(CJK)$ +$if(isbook)$ +\usepackage{ctex} %调用中文字体宏包 +\usepackage{indentfirst} %调用首行缩进宏包 +\usepackage{ctex} % 确保中文字体支持 +\usepackage{zhnumber} +% 修改 chapter 格式为 "第X章" +% \renewcommand{\chapterformat}{第~\thechapter~章} +% \renewcommand{\chapterformat}{第\zhnumber{\thechapter}章} +\renewcommand{\chaptermarkformat}{第~\zhnumber{\thechapter}~章} +\renewcommand{\chapterformat}{第\zhnumber{\thechapter}章} +\renewcommand*{\chapterlinesformat}[3]{% + \parbox{\linewidth}{\centering #2~\quad~#3} % 居中 + "·" 分隔 + % 或改用冒号分隔: + % \parbox{\linewidth}{\centering #2:#3} +} +\RedeclareSectionCommand[ + beforeskip=1.5em plus 0.5em minus 0.5em, + afterskip=1em plus 0.2em, + font=\large\bfseries +]{section} +\usepackage{zhnumber} % 确保已加载(或直接用 ctex) +% 修改目录中的章节编号为中文 +\addtokomafont{chapterentry}{\normalfont} % 可选:调整目录字体 +\renewcommand*{\chapterformat}{第\zhnumber{\thechapter}章} % 正文标题格式 +\renewcommand*{\chaptermarkformat}{第\zhnumber{\thechapter}章\quad} % 页眉标题格式 +% 关键!覆盖目录中的章节编号 +\renewcommand{\addchaptertocentry}[2]{% + \addtocentrydefault{chapter}{第\zhnumber{#1}章}{#2}% +} +\RedeclareSectionCommand[ + tocentryindent=0pt, + tocentrynumwidth=3.5em % 确保编号区域足够宽 +]{chapter} +$endif$ +$endif$ + +$if(tables)$ +\usepackage{longtable,booktabs,array} +$if(multirow)$ +\usepackage{multirow} +$endif$ +\usepackage{calc} % for calculating minipage widths +$if(beamer)$ +\usepackage{caption} +% Make caption package work with longtable +\makeatletter +\def\fnum@table{\tablename~\thetable} +\makeatother +$else$ +% Correct order of tables after \paragraph or \subparagraph +\usepackage{etoolbox} +\makeatletter +\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} +\makeatother +% Allow footnotes in longtable head/foot +\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} +\makesavenoteenv{longtable} +$endif$ +$endif$ +% add backlinks to footnote references, cf. https://tex.stackexchange.com/questions/302266/make-footnote-clickable-both-ways +$if(footnotes-disable-backlinks)$ +$else$ +\usepackage{footnotebackref} +$endif$ +$if(graphics)$ +\usepackage{graphicx} +\makeatletter +% \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +% \def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +% \makeatother +% % Scale images if necessary, so that they will not overflow the page +% % margins by default, and it is still possible to overwrite the defaults +% % using explicit options in \includegraphics[width, height, ...]{} +% \setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +\newsavebox\pandoc@box +\newcommand*\pandocbounded[1]{% scales image to fit in text height/width + \sbox\pandoc@box{#1}% + \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% + \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% + \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both + \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% + \else\usebox{\pandoc@box}% + \fi% +} +% Set default figure placement to htbp +\makeatletter +\def\fps@figure{htbp} +\makeatother +% \makeatletter Old options from template, replaced with quarto defaults above +% \newsavebox\pandoc@box +% \newcommand*\pandocbounded[1]{% scales image to fit in text height/width +% \sbox\pandoc@box{#1}% +% \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% +% \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% +% \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both +% \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% +% \else\usebox{\pandoc@box}% +% \fi% +% } +% % Set default figure placement to htbp +% % Make use of float-package and set default placement for figures to H. +% % The option H means 'PUT IT HERE' (as opposed to the standard h option which means 'You may put it here if you like'). +% \usepackage{float} +% \floatplacement{figure}{$if(float-placement-figure)$$float-placement-figure$$else$H$endif$} +% \makeatother +$endif$ +$if(svg)$ +\usepackage{svg} +$endif$ +$if(strikeout)$ +$-- also used for underline +\ifLuaTeX + \usepackage{luacolor} + \usepackage[soul]{lua-ul} +\else +\usepackage{soul} +$if(beamer)$ + \makeatletter + \let\HL\hl + \renewcommand\hl{% fix for beamer highlighting + \let\set@color\beamerorig@set@color + \let\reset@color\beamerorig@reset@color + \HL} + \makeatother +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + % soul's \st doesn't work for CJK: + \usepackage{xeCJKfntef} + \renewcommand{\st}[1]{\sout{#1}} + \fi +$endif$ +\fi +$endif$ +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +$if(numbersections)$ +\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$} +$else$ +\setcounter{secnumdepth}{-\maxdimen} % remove section numbering +$endif$ +$if(subfigure)$ +\usepackage{subcaption} +$endif$ +$if(beamer)$ +$else$ +$if(block-headings)$ +% Make \paragraph and \subparagraph free-standing +\makeatletter +\ifx\paragraph\undefined\else + \let\oldparagraph\paragraph + \renewcommand{\paragraph}{ + \@ifstar + \xxxParagraphStar + \xxxParagraphNoStar + } + \newcommand{\xxxParagraphStar}[1]{\oldparagraph*{#1}\mbox{}} + \newcommand{\xxxParagraphNoStar}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else + \let\oldsubparagraph\subparagraph + \renewcommand{\subparagraph}{ + \@ifstar + \xxxSubParagraphStar + \xxxSubParagraphNoStar + } + \newcommand{\xxxSubParagraphStar}[1]{\oldsubparagraph*{#1}\mbox{}} + \newcommand{\xxxSubParagraphNoStar}[1]{\oldsubparagraph{#1}\mbox{}} +\fi +\makeatother +$endif$ +$endif$ +$if(pagestyle)$ +\pagestyle{$pagestyle$} +$endif$ +$if(csl-refs)$ +% definitions for citeproc citations +\NewDocumentCommand\citeproctext{}{} +\NewDocumentCommand\citeproc{mm}{% + \begingroup\def\citeproctext{#2}\cite{#1}\endgroup} +\makeatletter + % allow citations to break across lines + \let\@cite@ofmt\@firstofone + % avoid brackets around text for \cite: + \def\@biblabel#1{} + \def\@cite#1#2{{#1\if@tempswa , #2\fi}} +\makeatother +\newlength{\cslhangindent} +\setlength{\cslhangindent}{1.5em} +\newlength{\csllabelwidth} +\setlength{\csllabelwidth}{3em} +\newenvironment{CSLReferences}[2] % #1 hanging-indent, #2 entry-spacing + {\begin{list}{}{% + \setlength{\itemindent}{0pt} + \setlength{\leftmargin}{0pt} + \setlength{\parsep}{0pt} + % turn on hanging indent if param 1 is 1 + \ifodd #1 + \setlength{\leftmargin}{\cslhangindent} + \setlength{\itemindent}{-1\cslhangindent} + \fi + % set entry spacing + \setlength{\itemsep}{#2\baselineskip}}} + {\end{list}} +\usepackage{calc} +\newcommand{\CSLBlock}[1]{\hfill\break\parbox[t]{\linewidth}{\strut\ignorespaces#1\strut}} +\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{\strut#1\strut}} +\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{\strut#1\strut}} +\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1} +$endif$ +$if(lang)$ +\ifLuaTeX +\usepackage[bidi=basic]{babel} +\else +\usepackage[bidi=default]{babel} +\fi +$if(babel-lang)$ +\babelprovide[main,import]{$babel-lang$} +$if(mainfont)$ +\ifPDFTeX +\else +\babelfont{rm}[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$} +\fi +$endif$ +$endif$ +$for(babel-otherlangs)$ +\babelprovide[import]{$babel-otherlangs$} +$endfor$ +$for(babelfonts/pairs)$ +\babelfont[$babelfonts.key$]{rm}{$babelfonts.value$} +$endfor$ +% get rid of language-specific shorthands (see #6817): +\let\LanguageShortHands\languageshorthands +\def\languageshorthands#1{} +$if(selnolig-langs)$ +\ifLuaTeX + \usepackage[$for(selnolig-langs)$$it$$sep$,$endfor$]{selnolig} % disable illegal ligatures +\fi +$endif$ +$endif$ +$for(header-includes)$ +$header-includes$ +$endfor$ +$if(dir)$ +\ifPDFTeX + \TeXXeTstate=1 + \newcommand{\RL}[1]{\beginR #1\endR} + \newcommand{\LR}[1]{\beginL #1\endL} + \newenvironment{RTL}{\beginR}{\endR} + \newenvironment{LTR}{\beginL}{\endL} +\fi +$endif$ +$if(natbib)$ +\usepackage[$natbiboptions$]{natbib} +\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} +$endif$ +$if(biblatex)$ +\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} +$for(bibliography)$ +\addbibresource{$bibliography$} +$endfor$ +$endif$ +$if(nocite-ids)$ +\nocite{$for(nocite-ids)$$it$$sep$, $endfor$} +$endif$ +$if(csquotes)$ +\usepackage{csquotes} +$endif$ +\usepackage{bookmark} +\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available +\urlstyle{$if(urlstyle)$$urlstyle$$else$same$endif$} +$if(links-as-notes)$ +% Make links footnotes instead of hotlinks: +\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}} +$endif$ +$if(verbatim-in-note)$ +\VerbatimFootnotes % allow verbatim text in footnotes +$endif$ +\hypersetup{ +$if(title-meta)$ + pdftitle={$title-meta$}, +$endif$ +$if(author-meta)$ + pdfauthor={$author-meta$}, +$endif$ +$if(lang)$ + pdflang={$lang$}, +$endif$ +$if(subject)$ +pdfsubject={$subject$}, +$endif$ +$if(keywords)$ + pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$}, +$endif$ +$if(colorlinks)$ + colorlinks=true, + linkcolor={$if(linkcolor)$$linkcolor$$else$default-linkcolor$endif$}, + filecolor={$if(filecolor)$$filecolor$$else$default-filecolor$endif$}, + citecolor={$if(citecolor)$$citecolor$$else$default-citecolor$endif$}, + urlcolor={$if(urlcolor)$$urlcolor$$else$default-urlcolor$endif$}, +$else$ +$if(boxlinks)$ +$else$ + hidelinks, +$endif$ +$endif$ + breaklinks=true, + pdfcreator={LaTeX via pandoc with the Eisvogel template}} +$if(title)$ +\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} +$endif$ +$if(subtitle)$ +$if(beamer)$ +$else$ +\usepackage{etoolbox} +\makeatletter +\providecommand{\subtitle}[1]{% add subtitle to \maketitle + \apptocmd{\@title}{\par {\large #1 \par}}{}{} +} +\makeatother +$endif$ +\subtitle{$subtitle$} +$endif$ +\author{$for(author)$$author$$sep$ \and $endfor$} +\date{$date$} +$if(beamer)$ +$if(institute)$ +\institute{$for(institute)$$institute$$sep$ \and $endfor$} +$endif$ +$if(titlegraphic)$ +\titlegraphic{\includegraphics$if(titlegraphicoptions)$[$for(titlegraphicoptions)$$titlegraphicoptions$$sep$, $endfor$]$endif${$titlegraphic$}} +$endif$ +$if(logo)$ +\logo{\includegraphics{$logo$}} +$endif$ +$endif$ + + + +%% +%% added +%% + +$if(page-background)$ +\usepackage[pages=all]{background} +$endif$ + +% +% for the background color of the title page +% +$if(titlepage)$ +\usepackage{pagecolor} +\usepackage{afterpage} +$if(titlepage-background)$ +\usepackage{tikz} +$endif$ +$if(geometry)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering]{geometry} +$endif$ +$endif$ + +% +% break urls +% +\PassOptionsToPackage{hyphens}{url} + +% +% When using babel or polyglossia with biblatex, loading csquotes is recommended +% to ensure that quoted texts are typeset according to the rules of your main language. +% +\usepackage{csquotes} + +% +% captions +% +\definecolor{caption-color}{HTML}{777777} +$if(beamer)$ +$else$ +\usepackage[font={stretch=1.2}, textfont={color=caption-color}, position=top, skip=4mm, labelfont=bf, singlelinecheck=false, justification=$if(caption-justification)$$caption-justification$$else$raggedright$endif$]{caption} +\setcapindent{0em} +$endif$ + +% +% blockquote +% +\definecolor{blockquote-border}{RGB}{221,221,221} +\definecolor{blockquote-text}{RGB}{119,119,119} +\usepackage{mdframed} +\newmdenv[rightline=false,bottomline=false,topline=false,linewidth=3pt,linecolor=blockquote-border,skipabove=\parskip]{customblockquote} +\renewenvironment{quote}{\begin{customblockquote}\list{}{\rightmargin=0em\leftmargin=0em}% +\item\relax\color{blockquote-text}\ignorespaces}{\unskip\unskip\endlist\end{customblockquote}} + +% +% Source Sans Pro as the default font family +% Source Code Pro for monospace text +% +% 'default' option sets the default +% font family to Source Sans Pro, not \sfdefault. +% +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + $if(fontfamily)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + $endif$ +\else % if not pdftex + $if(mainfont)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + + % XeLaTeX specific adjustments for straight quotes: https://tex.stackexchange.com/a/354887 + % This issue is already fixed (see https://github.com/silkeh/latex-sourcecodepro/pull/5) but the + % fix is still unreleased. + % TODO: Remove this workaround when the new version of sourcecodepro is released on CTAN. + \ifxetex + \makeatletter + \defaultfontfeatures[\ttfamily] + { Numbers = \sourcecodepro@figurestyle, + Scale = \SourceCodePro@scale, + Extension = .otf } + \setmonofont + [ UprightFont = *-\sourcecodepro@regstyle, + ItalicFont = *-\sourcecodepro@regstyle It, + BoldFont = *-\sourcecodepro@boldstyle, + BoldItalicFont = *-\sourcecodepro@boldstyle It ] + {SourceCodePro} + \makeatother + \fi + $endif$ +\fi + + +% setup for chinese font, by Ming +\setCJKmainfont{$CJKmainfont$}[BoldFont=$CJKboldfont$, ItalicFont=$CJKitalicfont$] + +% +% heading color +% +\definecolor{heading-color}{RGB}{40,40,40} +$if(beamer)$ +$else$ +\addtokomafont{section}{\color{heading-color}} +$endif$ +% When using the classes report, scrreprt, book, +% scrbook or memoir, uncomment the following line. +%\addtokomafont{chapter}{\color{heading-color}} + +% +% variables for title, author and date +% +$if(beamer)$ +$else$ +\usepackage{titling} +\title{$title$} +\author{$for(author)$$author$$sep$, $endfor$} +\date{$date$} +$endif$ + +% +% tables +% +$if(tables)$ + +\definecolor{table-row-color}{HTML}{F5F5F5} +\definecolor{table-rule-color}{HTML}{999999} + +%\arrayrulecolor{black!40} +\arrayrulecolor{table-rule-color} % color of \toprule, \midrule, \bottomrule +\setlength\heavyrulewidth{0.3ex} % thickness of \toprule, \bottomrule +\renewcommand{\arraystretch}{1.3} % spacing (padding) + +$if(table-use-row-colors)$ +% Unfortunately the colored cells extend beyond the edge of the +% table because pandoc uses @-expressions (@{}) like so: +% +% \begin{longtable}[]{@{}ll@{}} +% \end{longtable} +% +% https://en.wikibooks.org/wiki/LaTeX/Tables#.40-expressions +\usepackage{etoolbox} +\AtBeginEnvironment{longtable}{\rowcolors{2}{}{table-row-color!100}} +\preto{\toprule}{\hiderowcolors}{}{} +\appto{\endhead}{\showrowcolors}{}{} +\appto{\endfirsthead}{\showrowcolors}{}{} +$endif$ +$endif$ + +% +% remove paragraph indentation +% +% \setlength{\parindent}{0pt} +$if(parindent)$ +\setlength{\parindent}{2em} %设置首行缩进为2字符 +$else$ +\setlength{\parindent}{0pt} +$endif$ +\setlength{\parskip}{6pt plus 2pt minus 1pt} +\setlength{\emergencystretch}{3em} % prevent overfull lines + + + +% +% +% Listings +% +% + +$if(listings)$ + +% +% general listing colors +% +\definecolor{listing-background}{HTML}{F7F7F7} +\definecolor{listing-rule}{HTML}{B3B2B3} +\definecolor{listing-numbers}{HTML}{B3B2B3} +\definecolor{listing-text-color}{HTML}{000000} +\definecolor{listing-keyword}{HTML}{435489} +\definecolor{listing-keyword-2}{HTML}{1284CA} % additional keywords +\definecolor{listing-keyword-3}{HTML}{9137CB} % additional keywords +\definecolor{listing-identifier}{HTML}{435489} +\definecolor{listing-string}{HTML}{00999A} +\definecolor{listing-comment}{HTML}{8E8E8E} + +\lstdefinestyle{eisvogel_listing_style}{ + language = java, +$if(listings-disable-line-numbers)$ + xleftmargin = 0.6em, + framexleftmargin = 0.4em, +$else$ + numbers = left, + xleftmargin = 2.7em, + framexleftmargin = 2.5em, +$endif$ + backgroundcolor = \color{listing-background}, + basicstyle = \color{listing-text-color}\linespread{1.0}% + \lst@ifdisplaystyle% + $if(code-block-font-size)$$code-block-font-size$$else$\small$endif$% + \fi\ttfamily{}, + breaklines = true, + frame = single, + framesep = 0.19em, + rulecolor = \color{listing-rule}, + frameround = ffff, + tabsize = 4, + numberstyle = \color{listing-numbers}, + aboveskip = 1.0em, + belowskip = 0.1em, + abovecaptionskip = 0em, + belowcaptionskip = 1.0em, + keywordstyle = {\color{listing-keyword}\bfseries}, + keywordstyle = {[2]\color{listing-keyword-2}\bfseries}, + keywordstyle = {[3]\color{listing-keyword-3}\bfseries\itshape}, + sensitive = true, + identifierstyle = \color{listing-identifier}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + showstringspaces = false, + escapeinside = {/*@}{@*/}, % Allow LaTeX inside these special comments + literate = + {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 + {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 + {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 + {À}{{\`A}}1 {È}{{\`E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 + {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1 + {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1 + {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1 + {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1 + {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1 + {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1 + {€}{{\EUR}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1 + {»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1 + {…}{{\ldots}}1 {≥}{{>=}}1 {≤}{{<=}}1 {„}{{\glqq}}1 {“}{{\grqq}}1 + {”}{{''}}1 +} +\lstset{style=eisvogel_listing_style} + +% +% Java (Java SE 12, 2019-06-22) +% +\lstdefinelanguage{Java}{ + morekeywords={ + % normal keywords (without data types) + abstract,assert,break,case,catch,class,continue,default, + do,else,enum,exports,extends,final,finally,for,if,implements, + import,instanceof,interface,module,native,new,package,private, + protected,public,requires,return,static,strictfp,super,switch, + synchronized,this,throw,throws,transient,try,volatile,while, + % var is an identifier + var + }, + morekeywords={[2] % data types + % primitive data types + boolean,byte,char,double,float,int,long,short, + % String + String, + % primitive wrapper types + Boolean,Byte,Character,Double,Float,Integer,Long,Short + % number types + Number,AtomicInteger,AtomicLong,BigDecimal,BigInteger,DoubleAccumulator,DoubleAdder,LongAccumulator,LongAdder,Short, + % other + Object,Void,void + }, + morekeywords={[3] % literals + % reserved words for literal values + null,true,false, + }, + sensitive, + morecomment = [l]//, + morecomment = [s]{/*}{*/}, + morecomment = [s]{/**}{*/}, + morestring = [b]", + morestring = [b]', +} + +\lstdefinelanguage{XML}{ + morestring = [b]", + moredelim = [s][\bfseries\color{listing-keyword}]{<}{\ }, + moredelim = [s][\bfseries\color{listing-keyword}]{}, + moredelim = [l][\bfseries\color{listing-keyword}]{/>}, + moredelim = [l][\bfseries\color{listing-keyword}]{>}, + morecomment = [s]{}, + morecomment = [s]{}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + identifierstyle = \color{listing-identifier} +} +$endif$ + +% +% header and footer +% +$if(beamer)$ +$else$ +$if(disable-header-and-footer)$ +$else$ +\usepackage[headsepline,footsepline]{scrlayer-scrpage} + +\newpairofpagestyles{eisvogel-header-footer}{ + \clearpairofpagestyles + \ihead*{$if(header-left)$$header-left$$else$$title$$endif$} + \chead*{$if(header-center)$$header-center$$else$$endif$} + \ohead*{$if(header-right)$$header-right$$else$$date$$endif$} + \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot*{$if(footer-center)$$footer-center$$else$$endif$} + \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \addtokomafont{pageheadfoot}{\upshape} +} +\pagestyle{eisvogel-header-footer} + +\newpairofpagestyles{eisvogel-chapterpage-header-footer}{ + \clearpairofpagestyles + \setheadtopline{0pt} % 移除页眉顶部的横线(如果有) + \setheadsepline{0pt} + \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot*{$if(footer-center)$$footer-center$$else$$endif$} + \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \addtokomafont{pageheadfoot}{\upshape} +} + + +$if(isbook)$ +% \deftripstyle{ChapterStyle}{}{}{}{}{\pagemark}{} +% \renewcommand*{\chapterpagestyle}{ChapterStyle} +\renewcommand*{\chapterpagestyle}{eisvogel-chapterpage-header-footer} +$endif$ + + +$if(page-background)$ +\backgroundsetup{ +scale=1, +color=black, +opacity=$if(page-background-opacity)$$page-background-opacity$$else$0.2$endif$, +angle=0, +contents={% + \includegraphics[width=\paperwidth,height=\paperheight]{$page-background$} + }% +} +$endif$ +$endif$ +$endif$ + +% watermark +$if(watermark)$ +\usepackage{draftwatermark,xcolor} +\SetWatermarkText{\textcolor{$if(watermark-color)$$watermark-color$$else$gray!3$endif$}{$watermark$}} +\SetWatermarkScale{1.2} % 缩小水印尺寸(数值越小越密集) +\SetWatermarkAngle{45} % 斜角排列(经典水印样式) +\SetWatermarkLightness{0.99} % 亮度调节 +$endif$ + +%% +%% end added +%% + +\begin{document} + +%% +%% begin titlepage +%% +$if(beamer)$ +$else$ +$if(titlepage)$ +\begin{titlepage} +$if(titlepage-background)$ +\newgeometry{top=2cm, right=4cm, bottom=3cm, left=4cm} +$else$ +\newgeometry{left=2cm} +$endif$ +$if(titlepage-color)$ +\definecolor{titlepage-color}{HTML}{$titlepage-color$} +\newpagecolor{titlepage-color}\afterpage{\restorepagecolor} +$endif$ +$if(titlepage-background)$ +\tikz[remember picture,overlay] \node[inner sep=0pt] at (current page.center){\includegraphics[width=\paperwidth,height=\paperheight]{$titlepage-background$}}; +$endif$ +\newcommand{\colorRule}[3][black]{\textcolor[HTML]{#1}{\rule{#2}{#3}}} + +\NewDocumentEnvironment{dynalign}{} + {\begin{$if(titlepage-halign)$$titlepage-halign$$else$center$endif$}} + {\end{$if(titlepage-halign)$$titlepage-halign$$else$center$endif$}} + +\begin{dynalign} +\noindent +\\[-1em] +\color[HTML]{$if(titlepage-text-color)$$titlepage-text-color$$else$5F5F5F$endif$} +\makebox[0pt][l]{\colorRule[$if(titlepage-rule-color)$$titlepage-rule-color$$else$435488$endif$]{1.3\textwidth}{$if(titlepage-rule-height)$$titlepage-rule-height$$else$4$endif$pt}} +\par +\noindent + +$if(titlepage-logo)$ +\noindent +\vskip $if(logo-vskip)$$logo-vskip$$else$-8em$endif$ +\hskip $if(logo-hskip)$$logo-hskip$$else$-6em$endif$ +\includegraphics[width=$if(logo-width)$$logo-width$$else$35mm$endif$, left]{$titlepage-logo$} +$endif$ + +$if(titlepage-background)$ +% The titlepage with a background image has other text spacing and text size +{ + \setstretch{2} + \vfill + \vskip -8em + $if(title-vskip)$ + \vskip $title-vskip$ + $endif$ + $if(title-hskip)$ + \vskip $title-hskip$ + $endif$ + \noindent { + $if(title-size)$ + \$title-size$ + $else$ + \huge + $endif$ +\textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + { + $if(subtitle-size)$ + \$subtitle-size$ + $else$ + \Large + $endif$ + \textsf{$subtitle$}} + $endif$ + \vskip 2em + $if(author-vskip)$ + \vskip $author-vskip$ + $endif$ + \noindent { + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ + +\textsf{$for(author)$$author$$sep$, $endfor$} +\vskip 0.6em + $if(date-vskip)$ + \vskip $date-vskip$ + $endif$ +{\textsf{$if(institute)$$institute$\vskip 0.6em$endif$$date$}} +} + \vfill +} +$else$ +{ + \setstretch{1.4} + \vfill + \vskip 8em + $if(title-vskip)$ + \vskip $title-vskip$ + $endif$ + $if(title-hskip)$ + \vskip $title-hskip$ + $endif$ + \noindent {\huge \textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + {\Large \textsf{$subtitle$}} + $endif$ + \vskip 4em + $if(author-vskip)$ + \vskip $author-vskip$ + $endif$ + \noindent { + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ + +\textsf{$for(author)$$author$$sep$, $endfor$} +\vskip 0.6em + $if(date-vskip)$ + \vskip $date-vskip$ + $endif$ +} + \vfill +} +$endif$ + + +$if(titlepage-background)$ +$else$ + + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ +{\textsf{$if(institute)$$institute$\vskip 0.6em$endif$$date$}} +$endif$ +\end{dynalign} +\end{titlepage} +\restoregeometry +\pagenumbering{arabic} +$endif$ +$endif$ + + + +%% +%% end titlepage +%% + +$if(has-frontmatter)$ +\frontmatter +$endif$ +$if(title)$ +$if(beamer)$ +\frame{\titlepage} +% don't generate the default title +% $else$ +% \maketitle +$endif$ +$if(abstract)$ +\begin{abstract} +$abstract$ +\end{abstract} +$endif$ +$endif$ + +$if(first-chapter)$ +\setcounter{chapter}{$first-chapter$} +\addtocounter{chapter}{-1} +$endif$ + +$for(include-before)$ +$include-before$ + +$endfor$ +$if(toc)$ +$if(toc-title)$ +\renewcommand*\contentsname{$toc-title$} +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks] +$if(toc-title)$ + \frametitle{$toc-title$} +$endif$ + \setcounter{tocdepth}{$toc-depth$} + \tableofcontents +\end{frame} +$if(toc-own-page)$ +\newpage +$endif$ +$else$ +{ +$if(colorlinks)$ +\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$} +$endif$ +\setcounter{tocdepth}{$toc-depth$} +\tableofcontents +$if(toc-own-page)$ +\newpage +$endif$ +} +$endif$ +$endif$ +$if(lof)$ +\listoffigures +$endif$ +$if(lot)$ +\listoftables +$endif$ +$if(linestretch)$ +\setstretch{$linestretch$} +$endif$ +$if(has-frontmatter)$ +\mainmatter +$endif$ +$body$ + +$if(has-frontmatter)$ +\backmatter +$endif$ +$if(natbib)$ +$if(bibliography)$ +$if(biblio-title)$ +$if(has-chapters)$ +\renewcommand\bibname{$biblio-title$} +$else$ +\renewcommand\refname{$biblio-title$} +$endif$ +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue +$endif$ + \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} +$if(beamer)$ +\end{frame} +$endif$ + +$endif$ +$endif$ +$if(biblatex)$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue + \printbibliography[heading=none] +\end{frame} +$else$ +\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ +$endif$ + +$endif$ +$for(include-after)$ +$include-after$ + +$endfor$ +\end{document} diff --git a/_extensions/drwater/dwev/inst/elsevier-harvard.csl b/_extensions/drwater/dwev/inst/elsevier-harvard.csl new file mode 100755 index 0000000..5d88c51 --- /dev/null +++ b/_extensions/drwater/dwev/inst/elsevier-harvard.csl @@ -0,0 +1,239 @@ + + diff --git a/_extensions/drwater/dwev/inst/nature-biotechnology.csl b/_extensions/drwater/dwev/inst/nature-biotechnology.csl new file mode 100644 index 0000000..216c8b9 --- /dev/null +++ b/_extensions/drwater/dwev/inst/nature-biotechnology.csl @@ -0,0 +1,17 @@ + + diff --git a/_extensions/drwater/dwev/inst/nature.csl b/_extensions/drwater/dwev/inst/nature.csl new file mode 100644 index 0000000..7b058ba --- /dev/null +++ b/_extensions/drwater/dwev/inst/nature.csl @@ -0,0 +1,154 @@ + + diff --git a/_extensions/drwater/dwev/inst/rceeslogo.pdf b/_extensions/drwater/dwev/inst/rceeslogo.pdf new file mode 100644 index 0000000..51d1a45 Binary files /dev/null and b/_extensions/drwater/dwev/inst/rceeslogo.pdf differ diff --git a/_extensions/drwater/dwev/inst/rceeslogo.svg b/_extensions/drwater/dwev/inst/rceeslogo.svg new file mode 100644 index 0000000..44431ff --- /dev/null +++ b/_extensions/drwater/dwev/inst/rceeslogo.svg @@ -0,0 +1,5 @@ + + viewBox="0 0 621 690"> + + + diff --git a/_extensions/drwater/dwev/inst/rceeslonglogo.pdf b/_extensions/drwater/dwev/inst/rceeslonglogo.pdf new file mode 100644 index 0000000..50017f7 Binary files /dev/null and b/_extensions/drwater/dwev/inst/rceeslonglogo.pdf differ diff --git a/_extensions/drwater/dwev/inst/rceeslonglogo.svg b/_extensions/drwater/dwev/inst/rceeslonglogo.svg new file mode 100644 index 0000000..013b69d --- /dev/null +++ b/_extensions/drwater/dwev/inst/rceeslonglogo.svg @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/inst/signms.pdf b/_extensions/drwater/dwev/inst/signms.pdf new file mode 100644 index 0000000..8b9afc3 Binary files /dev/null and b/_extensions/drwater/dwev/inst/signms.pdf differ diff --git a/_extensions/drwater/dwev/inst/signms.png b/_extensions/drwater/dwev/inst/signms.png new file mode 100644 index 0000000..c292ad6 Binary files /dev/null and b/_extensions/drwater/dwev/inst/signms.png differ diff --git a/_extensions/drwater/dwev/inst/signms.pptx b/_extensions/drwater/dwev/inst/signms.pptx new file mode 100644 index 0000000..94e54f5 Binary files /dev/null and b/_extensions/drwater/dwev/inst/signms.pptx differ diff --git a/_extensions/drwater/dwev/inst/signms.svg b/_extensions/drwater/dwev/inst/signms.svg new file mode 100644 index 0000000..1218831 --- /dev/null +++ b/_extensions/drwater/dwev/inst/signms.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/inst/signmy.pdf b/_extensions/drwater/dwev/inst/signmy.pdf new file mode 100644 index 0000000..26d4e5f Binary files /dev/null and b/_extensions/drwater/dwev/inst/signmy.pdf differ diff --git a/_extensions/drwater/dwev/inst/signmy.png b/_extensions/drwater/dwev/inst/signmy.png new file mode 100755 index 0000000..83e6904 Binary files /dev/null and b/_extensions/drwater/dwev/inst/signmy.png differ diff --git a/_extensions/drwater/dwev/inst/signmy.pptx b/_extensions/drwater/dwev/inst/signmy.pptx new file mode 100644 index 0000000..0a8c283 Binary files /dev/null and b/_extensions/drwater/dwev/inst/signmy.pptx differ diff --git a/_extensions/drwater/dwev/inst/signmy.svg b/_extensions/drwater/dwev/inst/signmy.svg new file mode 100644 index 0000000..fde7fff --- /dev/null +++ b/_extensions/drwater/dwev/inst/signmy.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwev/inst/the-isme-j.csl b/_extensions/drwater/dwev/inst/the-isme-j.csl new file mode 100755 index 0000000..730aefc --- /dev/null +++ b/_extensions/drwater/dwev/inst/the-isme-j.csl @@ -0,0 +1,181 @@ + + diff --git a/_extensions/drwater/dwev/template.qmd b/_extensions/drwater/dwev/template.qmd new file mode 100644 index 0000000..cce05ef --- /dev/null +++ b/_extensions/drwater/dwev/template.qmd @@ -0,0 +1,149 @@ +--- +title: "中文报告模板" +author: "苏命" +institute: "中国科学院生态环境研究中心" +date: "today" +subject: "Markdown" +keywords: [Markdown, Example] +isbook: true +top-level-division: chapter +classoption: + - fntef + - UTF8 + - zihao=-4 # 正文字号小四 + - lang=cn + # - chinesefont=founder # founder|ctexfont|nofont + - scheme=chinese + - color=blue # blue|green| + - titlestyle=hang +# classoption: [oneside] +titlepage: true +keep-tex: false +titlepage-rule-color: "360049" +titlepage-text-color: "360049" +titlepage-rule-height: 0 +titlepage-background: "_extensions/drwater/dwev/inst/cover1.pdf" +titlepage-halign: "center" # flushleft | flushright +title-vskip: -30em +title-size: "Huge" +author-vskip: -4em +date-vskip: -1em +caption-justification: centering +numbersections: true +parindent: true +# titlepage-logo: "inst/rceeslogo.pdf" +# logo-width: 20mm +# logo-vskip: -8em +# logo-hskip: "-6em" +lang: zh-CN # 不能改为cn,否则目录等不是中文 +CJK: true +fig-pos: "!t" +colorlinks: true +urlcolor: blue +header-left: "\\leftmark" +header-center: "\\hspace{1cm}" +header-right: "第\\thepage 页" +footer-left: "\\hspace{1cm}" # \\thetitle +footer-center: "\\includegraphics[height=1.5em]{_extensions/drwater/dwev/inst/drwater-gray1.pdf}" +footer-right: "\\hspace{1cm}" +toc: true +toc-own-page: true +fig-toc: true +CJKmainfont: "Noto Serif CJK SC" +CJKmainboldfont: "NotoSerifCJKsc-Bold" +CJKmainitalicfont: "NotoSansCJKsc-Light" +CJKsansfont: "Noto Sans CJK SC" +CJKmonofont: "Noto Sans Mono CJK SC" +CJKoptions: | + AutoFakeBold=true +# include-in-header: header.tex +# watermark: "drwater" +# watermark-color: "gray!3" +format: dwev-pdf +--- + +```{r} +#| label: setup +#| include: false +#| cache: false +lang <- "cn" +RM <- "F" # global rendermode, L: load pdata; F: fast load pdf +isRendering <- !isTRUE(getOption('knitr.in.progress')) +require(lubridate) +require(tidyverse) +require(patchwork) +require(drwateR) +rmdify::rmd_init() +``` + + +# 摘要 + +# 项目背景与国内外现状介绍 + + + +::: callout-warning +Book in early development. Planned release in 202X. +::: + +*asdfsd* *你好* 阿斯顿发 **你好** asdf。本书分三大部分,分别是机器学习、贝叶斯建模和空间分析。三个部分分别依据任务类型、模型种类和数据类型展开,不同的写作出发点将呈现不一样的写作风格。应用机器学习首先需要确定任务类型,根据不同的任务选用不同的算法。贝叶斯建模从简单到复杂分频率和贝叶斯方法介绍主流的统计模型。应用空间分析方法需要根据空间数据类型(生成机理)而定,不同的生成机理将对应不同的建模和分析方法。机器学习根据任务类型分聚类、分类、回归和排序四个章节。贝叶斯建模根据模型种类分概率推理框架、线性模型、广义线性模型、分层正态模型、混合效应模型、广义可加模型、高斯过程回归、时间序列回归等八个章节。空间分析部分根据空间数据类型分点模式数据分析、点参考数据分析和区域数据分析三个章节。如[@fig-fig1]所示。 + + +```{r} +#| label: fig-fig1 +#| fig-cap: "asdf" + +plot(1) +``` + + + +## 环境信息 + +本书采用科学和技术写作排版系统 [Quarto](https://quarto.org/) 编写,所有代码和文本混编在 qmd 格式的纯文本文件中,具有计算可重复性,即内含的 R 语言、Stan 语言和 Python 语言代码都可运行,并将计算结果插入到最终的文档中,本书使用的主要 R 包及版本信息如[@eq-eq1]所示: + +$$ +x^2+y^2+z^2=a^2 +$$ {#eq-eq1} + + + + +# 主要进展1 + +## 主要进展2 + +本书分三大部分,分别是机器学习、贝叶斯建模和空间分析。三个部分分别依据任务类型、模型种类和数据类型展开,不同的写作出发点将呈现不一样的写作风格。应用机器学习首先需要确定任务类型,根据不同的任务选用不同的算法。贝叶斯建模从简单到复杂分频率和贝叶斯方法介绍主流的统计模型。应用空间分析方法需要根据空间数据类型(生成机理)而定,不同的生成机理将对应不同的建模和分析方法。机器学习根据任务类型分聚类、分类、回归和排序四个章节。贝叶斯建模根据模型种类分概率推理框架、线性模型、广义线性模型、分层正态模型、混合效应模型、广义可加模型、高斯过程回归、时间序列回归等八个章节。空间分析部分根据空间数据类型分点模式数据分析、点参考数据分析和区域数据分析三个章节。 + +## 主要进展2 + +本书分三大部分,分别是机器学习、贝叶斯建模和空间分析。三个部分分别依据任务类型、模型种类和数据类型展开,不同的写作出发点将呈现不一样的写作风格。应用机器学习首先需要确定任务类型,根据不同的任务选用不同的算法。贝叶斯建模从简单到复杂分频率和贝叶斯方法介绍主流的统计模型。应用空间分析方法需要根据空间数据类型(生成机理)而定,不同的生成机理将对应不同的建模和分析方法。机器学习根据任务类型分聚类、分类、回归和排序四个章节。贝叶斯建模根据模型种类分概率推理框架、线性模型、广义线性模型、分层正态模型、混合效应模型、广义可加模型、高斯过程回归、时间序列回归等八个章节。空间分析部分根据空间数据类型分点模式数据分析、点参考数据分析和区域数据分析三个章节。 + + +# 主要进展2 + +## 主要进展2 + +本书分三大部分,分别是机器学习、贝叶斯建模和空间分析。三个部分分别依据任务类型、模型种类和数据类型展开,不同的写作出发点将呈现不一样的写作风格。应用机器学习首先需要确定任务类型,根据不同的任务选用不同的算法。贝叶斯建模从简单到复杂分频率和贝叶斯方法介绍主流的统计模型。应用空间分析方法需要根据空间数据类型(生成机理)而定,不同的生成机理将对应不同的建模和分析方法。机器学习根据任务类型分聚类、分类、回归和排序四个章节。贝叶斯建模根据模型种类分概率推理框架、线性模型、广义线性模型、分层正态模型、混合效应模型、广义可加模型、高斯过程回归、时间序列回归等八个章节。空间分析部分根据空间数据类型分点模式数据分析、点参考数据分析和区域数据分析三个章节。 + +## 主要进展2 + +本书分三大部分,分别是机器学习、贝叶斯建模和空间分析。三个部分分别依据任务类型、模型种类和数据类型展开,不同的写作出发点将呈现不一样的写作风格。应用机器学习首先需要确定任务类型,根据不同的任务选用不同的算法。贝叶斯建模从简单到复杂分频率和贝叶斯方法介绍主流的统计模型。应用空间分析方法需要根据空间数据类型(生成机理)而定,不同的生成机理将对应不同的建模和分析方法。机器学习根据任务类型分聚类、分类、回归和排序四个章节。贝叶斯建模根据模型种类分概率推理框架、线性模型、广义线性模型、分层正态模型、混合效应模型、广义可加模型、高斯过程回归、时间序列回归等八个章节。空间分析部分根据空间数据类型分点模式数据分析、点参考数据分析和区域数据分析三个章节。 + +## 主要进展2 + +本书分三大部分,分别是机器学习、贝叶斯建模和空间分析。三个部分分别依据任务类型、模型种类和数据类型展开,不同的写作出发点将呈现不一样的写作风格。应用机器学习首先需要确定任务类型,根据不同的任务选用不同的算法。贝叶斯建模从简单到复杂分频率和贝叶斯方法介绍主流的统计模型。应用空间分析方法需要根据空间数据类型(生成机理)而定,不同的生成机理将对应不同的建模和分析方法。机器学习根据任务类型分聚类、分类、回归和排序四个章节。贝叶斯建模根据模型种类分概率推理框架、线性模型、广义线性模型、分层正态模型、混合效应模型、广义可加模型、高斯过程回归、时间序列回归等八个章节。空间分析部分根据空间数据类型分点模式数据分析、点参考数据分析和区域数据分析三个章节。 + +## 主要进展2 + +本书分三大部分,分别是机器学习、贝叶斯建模和空间分析。三个部分分别依据任务类型、模型种类和数据类型展开,不同的写作出发点将呈现不一样的写作风格。应用机器学习首先需要确定任务类型,根据不同的任务选用不同的算法。贝叶斯建模从简单到复杂分频率和贝叶斯方法介绍主流的统计模型。应用空间分析方法需要根据空间数据类型(生成机理)而定,不同的生成机理将对应不同的建模和分析方法。机器学习根据任务类型分聚类、分类、回归和排序四个章节。贝叶斯建模根据模型种类分概率推理框架、线性模型、广义线性模型、分层正态模型、混合效应模型、广义可加模型、高斯过程回归、时间序列回归等八个章节。空间分析部分根据空间数据类型分点模式数据分析、点参考数据分析和区域数据分析三个章节。 + + +# 结论与下一步计划 + +本书分三大部分,分别是机器学习、贝叶斯建模和空间分析。三个部分分别依据任务类型、模型种类和数据类型展开,不同的写作出发点将呈现不一样的写作风格。应用机器学习首先需要确定任务类型,根据不同的任务选用不同的算法。贝叶斯建模从简单到复杂分频率和贝叶斯方法介绍主流的统计模型。应用空间分析方法需要根据空间数据类型(生成机理)而定,不同的生成机理将对应不同的建模和分析方法。机器学习根据任务类型分聚类、分类、回归和排序四个章节。贝叶斯建模根据模型种类分概率推理框架、线性模型、广义线性模型、分层正态模型、混合效应模型、广义可加模型、高斯过程回归、时间序列回归等八个章节。空间分析部分根据空间数据类型分点模式数据分析、点参考数据分析和区域数据分析三个章节。 + +# 参考文献{-} + + diff --git a/_extensions/drwater/dwhm/_extension.yml b/_extensions/drwater/dwhm/_extension.yml new file mode 100644 index 0000000..b6cf7e7 --- /dev/null +++ b/_extensions/drwater/dwhm/_extension.yml @@ -0,0 +1,10 @@ +title: html +author: ming +version: 1.0.0 +quarto-required: ">=1.7.0" +contributes: + formats: + html: + toc: true + css: _extensions/drwater/dwhm/inst/drwater.css + theme: _extensions/drwater/dwhm/inst/drwater.scss diff --git a/_extensions/drwater/dwhm/inst/clab-tooltip.js b/_extensions/drwater/dwhm/inst/clab-tooltip.js new file mode 100644 index 0000000..900b133 --- /dev/null +++ b/_extensions/drwater/dwhm/inst/clab-tooltip.js @@ -0,0 +1,418 @@ +// clab-tooltip.js - 完全隔离事件版本(修改后的显示位置逻辑) +(function() { + // 全局变量存储从 RN.html 提取的内容 + let rnContentCache = {}; + let isRnContentLoaded = false; + let activeTooltip = null; + let hideTimer = null; + let isMouseOverTooltip = false; + + // 从 RN.html 提取内容(保持不变) + async function loadRnContent() { + try { + console.log('加载 RN.html...'); + const response = await fetch('RN.html'); + if (!response.ok) throw new Error(`HTTP error: ${response.status}`); + + const htmlText = await response.text(); + const parser = new DOMParser(); + const rnDoc = parser.parseFromString(htmlText, 'text/html'); + + // 查找所有包含 data-options 的元素 + const optionElements = rnDoc.querySelectorAll('[data-options]'); + console.log(`找到 ${optionElements.length} 个 data-options 元素`); + + optionElements.forEach(element => { + const optionValue = element.getAttribute('data-options'); + if (!optionValue) return; + + // 向前查找最近的 blockquote + let prevElement = element.previousElementSibling; + let blockquote = null; + + // 先找前一个兄弟元素 + while (prevElement) { + if (prevElement.tagName === 'BLOCKQUOTE') { + blockquote = prevElement; + break; + } + prevElement = prevElement.previousElementSibling; + } + + // 如果没找到,向上查找 + if (!blockquote) { + let parent = element.parentElement; + while (parent) { + let sibling = parent.previousElementSibling; + while (sibling) { + if (sibling.tagName === 'BLOCKQUOTE') { + blockquote = sibling; + break; + } + sibling = sibling.previousElementSibling; + } + if (blockquote) break; + parent = parent.parentElement; + } + } + + if (blockquote) { + const lis = blockquote.querySelectorAll('li'); + if (lis.length > 0) { + const liContents = Array.from(lis).map(li => li.textContent.trim()); + + if (!rnContentCache[optionValue]) { + rnContentCache[optionValue] = []; + } + + // 存储所有引用 + rnContentCache[optionValue].push({ + contents: liContents + }); + } + } + }); + + isRnContentLoaded = true; + + console.log('内容加载完成'); + Object.keys(rnContentCache).forEach(key => { + console.log(`"${key}": ${rnContentCache[key].length} Questions`); + }); + + } catch (error) { + console.error('加载失败:', error); + } + } + + // 创建 tooltip(保持不变) + function createTooltip() { + const tooltip = document.createElement('div'); + tooltip.className = 'clab-tooltip'; + tooltip.id = 'clab-tooltip-element'; + + // 完全阻止所有事件冒泡 + const stopAllEvents = (e) => { + e.stopPropagation(); + e.stopImmediatePropagation(); + e.preventDefault(); + return false; + }; + + // 阻止所有可能的事件 + const events = [ + 'mousedown', 'mouseup', 'click', 'dblclick', + 'mousemove', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave', + 'wheel', 'scroll', + 'touchstart', 'touchmove', 'touchend', 'touchcancel', + 'pointerdown', 'pointermove', 'pointerup', 'pointercancel', + 'dragstart', 'dragover', 'drop' + ]; + + events.forEach(eventType => { + tooltip.addEventListener(eventType, stopAllEvents, true); // 捕获阶段 + tooltip.addEventListener(eventType, stopAllEvents, false); // 冒泡阶段 + }); + + // 允许 wheel 事件用于滚动,但阻止冒泡 + tooltip.addEventListener('wheel', function(e) { + e.stopPropagation(); + e.stopImmediatePropagation(); + // 允许默认的滚动行为 + }, { passive: false }); + + // 允许鼠标在 tooltip 内移动 + tooltip.addEventListener('mousemove', function(e) { + e.stopPropagation(); + }, { passive: true }); + + document.body.appendChild(tooltip); + return tooltip; + } + + // 显示 tooltip - 已修改位置逻辑 + function showTooltip(element, tooltip) { + const rect = element.getBoundingClientRect(); + const optionValue = element.getAttribute('data-options'); + + // 清空内容 + tooltip.innerHTML = ''; + + if (rnContentCache[optionValue] && rnContentCache[optionValue].length > 0) { + const entries = rnContentCache[optionValue]; + + // 标题显示选项 + const title = document.createElement('div'); + title.className = 'tooltip-title'; + title.textContent = optionValue; + if (entries.length > 1) { + title.textContent += ` (${entries.length} questions)`; + } + tooltip.appendChild(title); + + // 显示所有引用 + entries.forEach((entry, entryIndex) => { + const content = entry.contents; + + if (content.length === 1) { + // 单一条目 + const entryDiv = document.createElement('div'); + entryDiv.className = 'entry-single'; + + if (entries.length >= 1) { + entryDiv.innerHTML = `Q${entryIndex + 1}: ${content[0]}`; + } else { + entryDiv.textContent = content[0]; + } + + tooltip.appendChild(entryDiv); + } else { + // 多个条目 + const entryDiv = document.createElement('div'); + entryDiv.className = 'entry-multiple'; + + if (entries.length > 1) { + const header = document.createElement('div'); + header.className = 'q-header'; + header.textContent = `Q${entryIndex + 1}:`; + entryDiv.appendChild(header); + } + + const ol = document.createElement('ol'); + ol.className = 'q-list'; + + content.forEach((item, itemIndex) => { + const li = document.createElement('li'); + li.innerHTML = `${entryIndex + 1}.${itemIndex + 1} ${item}`; + ol.appendChild(li); + }); + + entryDiv.appendChild(ol); + tooltip.appendChild(entryDiv); + } + }); + } else { + // 没有找到内容 + const noContent = document.createElement('div'); + noContent.className = 'tooltip-no-content'; + noContent.textContent = '未找到相关内容'; + tooltip.appendChild(noContent); + } + + // 确保 tooltip 有合适的尺寸 + tooltip.style.position = 'fixed'; + tooltip.style.zIndex = '10000'; + tooltip.style.maxWidth = '400px'; + tooltip.style.maxHeight = '500px'; + tooltip.style.overflowY = 'auto'; + tooltip.style.boxSizing = 'border-box'; + + // 首先隐藏并获取尺寸 + tooltip.style.visibility = 'hidden'; + tooltip.classList.add('active'); + document.body.appendChild(tooltip); + + const tooltipWidth = Math.min(tooltip.scrollWidth, 400); + const tooltipHeight = Math.min(tooltip.scrollHeight, 500); + + tooltip.style.width = tooltipWidth + 'px'; + tooltip.style.height = 'auto'; + + const padding = 5; + const minDistanceFromEdge = 20; + + let left, top; + let position = 'right'; // 首选右侧 + + // 检查右侧空间 + if (rect.right + padding + tooltipWidth <= window.innerWidth - minDistanceFromEdge) { + // 右侧有足够空间 + left = rect.right + padding; + top = rect.top; + position = 'right'; + } else if (rect.left - padding - tooltipWidth >= minDistanceFromEdge) { + // 左侧有足够空间 + left = rect.left - padding - tooltipWidth; + top = rect.top; + position = 'left'; + } else { + // 两侧都没有足够空间,显示在下方 + left = Math.max( + minDistanceFromEdge, + Math.min( + rect.left + (rect.width - tooltipWidth) / 2, + window.innerWidth - tooltipWidth - minDistanceFromEdge + ) + ); + top = rect.bottom + padding; + position = 'bottom'; + } + + // 垂直边界检查 - 确保不超出屏幕 + if (top + tooltipHeight > window.innerHeight - minDistanceFromEdge) { + // 如果下方空间不足,尝试显示在上方 + if (rect.top - padding - tooltipHeight >= minDistanceFromEdge) { + top = rect.top - padding - tooltipHeight; + } else { + // 上下都不够,显示在中间 + top = Math.max( + minDistanceFromEdge, + Math.min( + top, + window.innerHeight - tooltipHeight - minDistanceFromEdge + ) + ); + } + } + + // 水平边界检查 - 确保不超出屏幕 + if (position === 'right' || position === 'left') { + left = Math.max( + minDistanceFromEdge, + Math.min(left, window.innerWidth - tooltipWidth - minDistanceFromEdge) + ); + } + + tooltip.style.left = left + 'px'; + tooltip.style.top = top + 'px'; + tooltip.style.visibility = 'visible'; + + // 添加一个小箭头指示方向 + tooltip.setAttribute('data-position', position); + + activeTooltip = tooltip; + isMouseOverTooltip = true; + + // 添加 overlay 防止 body 交互 + addOverlay(); + } + + // 添加半透明 overlay(保持不变) + function addOverlay() { + // 移除现有的 overlay + removeOverlay(); + + const overlay = document.createElement('div'); + overlay.id = 'tooltip-overlay'; + overlay.style.cssText = ` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 9999; + background: transparent; + pointer-events: none; + `; + document.body.appendChild(overlay); + + // 将 overlay 的 pointer-events 设为 auto,但阻止所有事件 + overlay.addEventListener('mousedown', stopEvent, true); + overlay.addEventListener('mouseup', stopEvent, true); + overlay.addEventListener('click', stopEvent, true); + overlay.addEventListener('mousemove', stopEvent, true); + overlay.addEventListener('wheel', stopEvent, true); + + function stopEvent(e) { + e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + return false; + } + } + + // 移除 overlay(保持不变) + function removeOverlay() { + const overlay = document.getElementById('tooltip-overlay'); + if (overlay) { + overlay.remove(); + } + } + + // 隐藏 tooltip(保持不变) + function hideTooltip() { + if (!isMouseOverTooltip && activeTooltip) { + activeTooltip.classList.remove('active'); + activeTooltip = null; + removeOverlay(); + } + } + + // 强制隐藏 tooltip(保持不变) + function forceHideTooltip() { + if (activeTooltip) { + activeTooltip.classList.remove('active'); + activeTooltip = null; + isMouseOverTooltip = false; + removeOverlay(); + } + } + + // 初始化(保持不变) + document.addEventListener('DOMContentLoaded', function() { + console.log('初始化 clab-tooltip'); + + const clabElements = document.querySelectorAll('.clab[data-options]'); + console.log(`找到 ${clabElements.length} 个 .clab 元素`); + + if (clabElements.length === 0) return; + + // 加载内容 + loadRnContent(); + + // 创建 tooltip + const tooltip = createTooltip(); + + // tooltip 鼠标进入/离开 + tooltip.addEventListener('mouseenter', function() { + isMouseOverTooltip = true; + clearTimeout(hideTimer); + }); + + tooltip.addEventListener('mouseleave', function() { + isMouseOverTooltip = false; + hideTimer = setTimeout(() => { + forceHideTooltip(); + }, 100); + }); + + // 为所有 .clab 元素添加事件监听 + clabElements.forEach(clab => { + clab.addEventListener('mouseenter', function() { + clearTimeout(hideTimer); + + setTimeout(() => { + if (isRnContentLoaded) { + showTooltip(this, tooltip); + } + }, 100); + }); + + clab.addEventListener('mouseleave', function() { + hideTimer = setTimeout(() => { + hideTooltip(); + }, 100); + }); + }); + + // ESC 键隐藏 tooltip + document.addEventListener('keydown', function(e) { + if (e.key === 'Escape' && activeTooltip) { + forceHideTooltip(); + } + }); + + // 点击其他地方隐藏 tooltip + document.addEventListener('click', function(e) { + if (activeTooltip && !activeTooltip.contains(e.target)) { + forceHideTooltip(); + } + }); + + // 窗口大小改变时隐藏 tooltip + window.addEventListener('resize', forceHideTooltip); + + // 滚动时隐藏 tooltip + window.addEventListener('scroll', forceHideTooltip); + }); +})(); diff --git a/_extensions/drwater/dwhm/inst/drwater.css b/_extensions/drwater/dwhm/inst/drwater.css new file mode 100755 index 0000000..1c92fe3 --- /dev/null +++ b/_extensions/drwater/dwhm/inst/drwater.css @@ -0,0 +1,384 @@ +.udot { + text-decoration-line: underline; + text-decoration-color: rgb(50, 50, 50); + text-decoration-style: dashed; + text-decoration-thickness: 1px; +} + +.good { + background-color: forestgreen; + color: lightyellow; +} + +.bad { + background-color: orangered; + color: lightyellow; +} + +.del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.5px; +} + + +.todo { + background-color: darkorange; + color: lightyellow; +} + +.com { + background-color: #0025ff; + font-weight: bold; + color: lightyellow; +} + +.add { + text-decoration-line: underline; + text-decoration-color: rgb(222 13 13); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + + +del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.0px; +} + + +ins { + text-decoration-color: rgb(222 93 93); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + + + +/* clab-style.css */ +.clab { + display: inline !important; + position: relative !important; + cursor: pointer !important; + padding: 2px 4px !important; + margin: 0 1px !important; + border-radius: 3px !important; + font: inherit !important; + color: #000000 !important; + text-decoration: none !important; + vertical-align: baseline !important; + line-height: inherit !important; + z-index: 1 !important; +} + +/* 随机背景色(使用预定义颜色) */ +.clab:nth-child(10n+1) { background-color: #E3F2FD !important; } +.clab:nth-child(10n+2) { background-color: #F3E5F5 !important; } +.clab:nth-child(10n+3) { background-color: #E8F5E9 !important; } +.clab:nth-child(10n+4) { background-color: #FFF3E0 !important; } +.clab:nth-child(10n+5) { background-color: #FCE4EC !important; } +.clab:nth-child(10n+6) { background-color: #E0F7FA !important; } +.clab:nth-child(10n+7) { background-color: #F1F8E9 !important; } +.clab:nth-child(10n+8) { background-color: #FFF8E1 !important; } +.clab:nth-child(10n+9) { background-color: #EDE7F6 !important; } +.clab:nth-child(10n+10) { background-color: #E8EAF6 !important; } + +/* 基础hover效果 */ +span.clab:hover { + outline: 2px solid rgba(0,0,0,0.2) !important; + outline-offset: 2px !important; + z-index: 1000 !important; +} + + + + +/* clab-tooltip 下方显示样式 */ +.clab-tooltip { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + color: white; + padding: 5px; + border: 1px solid #444; + /* -webkit-user-select: none; */ + position: fixed; + background: rgba(0, 0, 0, 0.95); + border-radius: 8px; + z-index: 10000; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), + 0 0 0 1px rgba(255, 255, 255, 0.1); + font-size: 14px; + line-height: 1.1; + max-width: 500px; + max-height: 800px; + overflow-y: auto; + opacity: 0; + visibility: hidden; + transition: opacity 0.2s ease, visibility 0.2s ease, transform 0.2s ease; + overscroll-behavior: contain; + pointer-events: auto !important; +} + + +/* Tooltip 箭头 */ +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border: 6px solid transparent; + border-bottom-color: #2a2a2a; + border-top: none; +} + +/* tooltip 在上方的箭头(向下) */ +.clab-tooltip.above .tooltip-arrow { + border-top-color: #2a2a2a; + border-bottom: none; +} + +/* 标题 */ +.tooltip-title { + font-weight: 600; + color: #FF9800; + margin-bottom: 6px; + padding-bottom: 4px; + border-bottom: 1px solid #444; + font-size: 14px; + font-family: monospace; + line-height: 0.8; + pointer-events: none; +} + +/* 单一条目 */ +.entry-single { + padding: 4px 4px; + margin-bottom: 6px; + background: rgba(255, 255, 255, 0.05); + border-radius: 6px; + border-left: 3px solid #ffffff; + line-height: 1.2; + cursor: default; +} + +/* Q标签样式 */ +.q-label { + display: inline-block; + color: #FF9800; + font-weight: 600; + margin-right: 8px; + min-width: 35px; +} + +/* 多个条目的引用 */ +.entry-multiple { + padding: 4px 4px; + margin-bottom: 6px; + background: rgba(255, 255, 255, 0.05); + border-radius: 6px; + border-left: 3px solid #ffffff; + line-height: 1.2; + cursor: default; +} + +/* 多引用标题 */ +.q-header { + color: #FF9800; + font-weight: 600; + margin-bottom: 8px; + font-size: 13px; + pointer-events: none; +} + +/* 列表 */ +.q-list { + margin: 0; + padding-left: 0; + list-style: none; +} + +.q-list li { + margin-bottom: 10px; + padding-left: 0; + line-height: 1.2; + position: relative; + cursor: default; + padding: 4px 0; +} + +/* 子标签样式 */ +.q-sublabel { + display: inline-block; + color: #4CAF50; + font-weight: 600; + margin-right: 2px; + min-width: 25px; +} + +/* 条目间空行 */ +/* .entry-spacer { */ +/* height: 12px; */ +/* pointer-events: none; */ +/* } */ + +/* 无内容 */ +.tooltip-no-content { + color: #ff6b6b; + font-style: italic; + padding: 20px; + text-align: center; + background: rgba(255, 107, 107, 0.05); + border-radius: 6px; + cursor: default; +} + +/* 滚动条 */ +.clab-tooltip::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +.clab-tooltip::-webkit-scrollbar-track { + background: #1a1a1a; + border-radius: 4px; +} + +.clab-tooltip::-webkit-scrollbar-thumb { + background: #4CAF50; + border-radius: 4px; +} + +.clab-tooltip::-webkit-scrollbar-thumb:hover { + background: #45a049; +} + + +/* 允许内容文本选择 */ +.entry-single, +.entry-multiple, +.q-list li { + user-select: text; + -webkit-user-select: text; +} + +/* 鼠标在 tooltip 上时的样式 */ +.clab-tooltip:hover { + cursor: default; +} + + +.clab-tooltip.active { + opacity: 1; + visibility: visible; + transform: translateY(0); +} + +.clab-tooltip ul { + margin: 0; + padding-left: 20px; +} + +.clab-tooltip li { + margin-bottom: 8px; + position: relative; +} + +.clab-tooltip .source { + margin-top: 10px; + padding-top: 10px; + border-top: 1px solid rgba(255,255,255,0.1); + font-size: 11px; + color: #aaa; + font-style: italic; +} + +.clab-tooltip .entry { + margin-bottom: 15px; + padding-bottom: 10px; + border-bottom: 1px solid rgba(255,255,255,0.1); +} + +.clab-tooltip .entry:last-child { + border-bottom: none; +} + + + +.rem { + background-color: darkorange; + color: lightyellow; + text-decoration-thickness: 2px; +} + + +#criticnav { + position: fixed; + z-index: 1100; + top: 0; + right: 0; + width: 120px; + border-bottom: solid 1px #ffffff; + margin: 0; + padding: 10; + background-color: rgb(143 38 38 / 95%); + color: #ffffff; + font-size: 12px; + font-family: "Helvetica Neue", helvetica, arial, sans-serif !important +} + +#criticnav ul { + list-style-type: none; + width: 90%; + margin: 0 auto; + padding: 0 +} + +#criticnav ul li { + display: block; + width: 100px; + min-width: 80px; + text-align: center; + padding: 5px 0 3px !important; + margin: 5px 2px !important; + line-height: 1em; + float: center; + text-transform: uppercase; + cursor: pointer; + border-radius: 20px; + border: 3px solid rgba(255,255,255,0); + color: #fff !important +} + +p { + text-align: left; /* 小屏幕左对齐 */ +} + +@media (min-width: 768px) { + p { + text-align: justify; + hyphens: auto; /* 自动断字 */ + -webkit-hyphens: auto; /* Safari 支持 */ + /* 可选:控制断字行为 */ + hyphenate-limit-chars: 6 3 2; /* 最小单词长度 前/后最小字符数 */ + } +} + +@media (min-width: 992px) { + body .page-columns { + display: grid; + gap: 0; + grid-template-columns: [screen-start] 0.5em [screen-start-inset] 0fr [page-start page-start-inset] 5px [body-start-outset] 5px [body-start] 0.5em [body-content-start] minmax(350px, calc(855px - 0em)) [body-content-end] 0.5em [body-end] 5px [body-end-outset] minmax(75px, 550px) [page-end-inset] 1px [page-end] 1fr [screen-end-inset] 0.5em [screen-end]; + } +} + + +@media (min-width: 1280px) { + body .page-columns { + display: grid; + gap: 0; + grid-template-columns: [screen-start] 3.5em [screen-start-inset] 2fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 3.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 400px) [page-end-inset] 35px [page-end] 2fr [screen-end-inset] 1.5em [screen-end]; + } +} diff --git a/_extensions/drwater/dwhm/inst/drwater.scss b/_extensions/drwater/dwhm/inst/drwater.scss new file mode 100644 index 0000000..93672cf --- /dev/null +++ b/_extensions/drwater/dwhm/inst/drwater.scss @@ -0,0 +1,415 @@ +/*-- scss:defaults --*/ + +$theme: "drwater" !default; + +// +// Color system +// + +$white: #ffffff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #868e96 !default; +$gray-700: #495057 !default; +$gray-800: #373a3c !default; +$gray-900: #212529 !default; +$black: #000000 !default; + +$blue: #2780e3 !default; +$indigo: #6610f2 !default; +$purple: #170c3a !default; +$pink: #a52c60 !default; +$red: #cf4446 !default; +$orange: #ee6a24 !default; +$light-orange: #fb9e07 !default; +$yellow: #f6d645 !default; +$green: #118230 !default; +$teal: #20c997 !default; +$cyan: #3093cf !default; + +$primary: $pink !default; +$secondary: $gray-700 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $orange !default; +$danger: $red !default; +$light: $gray-400 !default; +$dark: $black !default; + +// Fonts + +$font-family-sans-serif: "Libre Franklin" !default; + +$headings-font-family: "Jost" !default; +$headings-font-weight: 600 !default; + +$navbar-font-family: "Jost" !default; +$toc-font-family: "Jost" !default; +$footer-font-family: "Jost" !default; + +// Body +$body-color: $gray-900 !default; + +// Links +$link-color: $orange !default; +$link-decoration: none !default; +$link-hover-color: $red !default; +$link-hover-decoration: underline !default; + +// Inline code +$code-bg: $gray-200 !default; +$code-color: $gray-900 !default; + +// Code copy +$btn-code-copy-color-active: $orange !default; + +// TOC +$toc-color: $orange; +$toc-font-size: 1em; + +// Navbar +$navbar-bg: $purple !default; +$navbar-fg: $white !default; +$navbar-hl: $light-orange !default; + +// Footer +$footer-bg: $gray-900 !default; +$footer-fg: $gray-300 !default; + +/*-- scss:rules --*/ + +$web-font-path: "https://fonts.googleapis.com/css2?family=Jost:ital,wght@0,100..900;1,100..900&family=Libre+Franklin:ital,wght@0,100..900;1,100..900&display=swap" !default; + +@if $web-font-path { + @import url($web-font-path); +} + +body { + -webkit-font-smoothing: antialiased; +} + +/* Logo 悬停效果 */ +.navbar-brand img { + transition: all 0.3s ease; + filter: brightness(0) invert(1); + + &:hover { + filter: brightness(0) invert(0.55) sepia(1) saturate(2000%) hue-rotate(-8deg) brightness(1.05) contrast(1.2); + transform: scale(1.05); + } +} + +// ============================================= +// 桌面端样式 - 使用悬停展开下拉菜单 +// ============================================= +@media (min-width: 992px) { + /* 导航栏主菜单项样式 */ + .navbar-nav .nav-item { + position: relative; + margin: 0 0.2rem; + + .nav-link { + position: relative; + color: $navbar-fg !important; + font-weight: 500; + padding: 0.75rem 1rem !important; + border-radius: 8px; + transition: all 0.3s ease; + z-index: 1; + + /* 玻璃效果背景 */ + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba($white, 0.1); + backdrop-filter: blur(10px); + border-radius: 8px; + opacity: 0; + transition: all 0.3s ease; + z-index: -1; + border: 1px solid rgba($white, 0.2); + } + + &:hover { + color: $light-orange !important; + transform: translateY(-2px); + + &::before { + opacity: 1; + background: rgba($white, 0.15); + backdrop-filter: blur(15px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); + } + } + + /* 激活状态 */ + &.active { + color: $light-orange !important; + font-weight: 600; + + &::before { + opacity: 1; + background: rgba($light-orange, 0.2); + backdrop-filter: blur(15px); + border: 1px solid rgba($light-orange, 0.3); + } + } + } + } + + /* 有下拉菜单的主菜单项特殊样式 */ + .navbar-nav .nav-item.dropdown { + .nav-link { + padding-right: 2rem !important; + + &::after { + position: absolute; + right: 1rem; + top: 50%; + transform: translateY(-50%); + transition: all 0.3s ease; + } + } + + &:hover .nav-link::before { + opacity: 1; + background: rgba($white, 0.2); + backdrop-filter: blur(20px); + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + + &:hover .nav-link::after { + transform: translateY(-50%) rotate(-180deg); + border-top-color: $light-orange; + } + } + + /* 桌面端下拉菜单悬停效果 */ + .navbar-nav .nav-item.dropdown:hover .dropdown-menu { + display: block !important; + opacity: 1 !important; + visibility: visible !important; + transform: translateY(0) !important; + } + + .dropdown-menu { + display: block; + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: all 0.3s ease; + background: rgba($purple, 0.98) !important; + backdrop-filter: blur(20px); + border: 1px solid rgba($white, 0.1); + border-top: none; + border-radius: 0 0 8px 8px; + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2); + margin-top: -1px; + padding: 0.5rem 0; + + &.show { + display: block; + opacity: 1; + visibility: visible; + transform: translateY(0); + } + } + + .dropdown-item { + color: $white !important; + font-family: $navbar-font-family; + padding: 0.75rem 1.5rem; + transition: all 0.2s ease; + position: relative; + + /* 下拉菜单项的玻璃效果 */ + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba($white, 0.05); + border-radius: 4px; + opacity: 0; + transition: all 0.2s ease; + z-index: -1; + } + + &:hover, &:focus { + color: $light-orange !important; + transform: translateX(5px); + background: transparent !important; + + &::before { + opacity: 1; + background: rgba($white, 0.1); + } + } + } + + /* 确保下拉菜单与主菜单视觉上连接 */ + .navbar-nav .nav-item.dropdown:hover .nav-link { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } +} + +// ============================================= +// 移动端样式 - 使用点击展开下拉菜单 +// ============================================= +@media (max-width: 991.98px) { + /* 完全重置移动端导航样式,使用 Bootstrap 默认行为 */ + .navbar-collapse { + background: rgba($purple, 0.98); + backdrop-filter: blur(10px); + border-top: 1px solid rgba($white, 0.1); + margin-top: 0.5rem; + padding: 0.5rem 0; + + .navbar-nav { + .nav-item { + margin: 0; + + .nav-link { + color: $navbar-fg !important; + padding: 1rem 1.5rem !important; + border-radius: 0; + transition: all 0.2s ease; + display: flex; + justify-content: space-between; + align-items: center; + + &:hover { + color: $light-orange !important; + background: rgba($white, 0.1); + } + + &.active { + color: $light-orange !important; + background: rgba($light-orange, 0.1); + font-weight: 600; + } + } + + /* 下拉菜单项样式 */ + &.dropdown { + .dropdown-toggle::after { + transition: transform 0.3s ease; + } + + &.show { + .dropdown-toggle { + color: $light-orange !important; + background: rgba($white, 0.15); + + &::after { + transform: rotate(-180deg); + } + } + } + + .dropdown-menu { + background: rgba(darken($purple, 5%), 0.95) !important; + border: none; + border-radius: 0; + padding: 0; + margin: 0; + position: static; + float: none; + display: none; + + &.show { + display: block !important; + } + } + } + } + } + } + + /* 移动端下拉菜单项 */ + .dropdown-item { + color: $navbar-fg !important; + padding: 0.875rem 1.5rem 0.875rem 2.5rem !important; + border-radius: 0; + transition: all 0.2s ease; + + &:hover, &:focus { + color: $light-orange !important; + background: rgba($white, 0.1) !important; + transform: none; + } + + &.active { + color: $light-orange !important; + background: rgba($light-orange, 0.1) !important; + font-weight: 600; + } + } + + /* 移动端导航栏折叠按钮 */ + .navbar-toggler { + border: 1px solid rgba($white, 0.2); + padding: 0.5rem 0.75rem; + + &:focus { + box-shadow: 0 0 0 0.2rem rgba($light-orange, 0.25); + } + + .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + } + } + + /* 禁用桌面端的悬停效果 */ + .navbar-nav .nav-item .nav-link::before { + display: none; + } + + .navbar-nav .nav-item.dropdown:hover .dropdown-menu { + display: none !important; + } +} + +// ============================================= +// 通用样式 +// ============================================= + +/* 导航栏整体样式 */ +.navbar { + backdrop-filter: blur(10px); + background: rgba($purple, 0.95) !important; + border-bottom: 1px solid rgba($white, 0.1); +} + +/* 为有下拉菜单的导航项添加视觉指示 */ +.navbar-nav .nav-item.dropdown > .nav-link::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} + +/* 确保 Bootstrap 的 JavaScript 交互正常工作 */ +.navbar-nav .dropdown-toggle::after { + display: inline-block !important; +} + +/* 修复移动端点击事件 */ +.navbar-nav .nav-item.dropdown .nav-link { + cursor: pointer; +} diff --git a/_extensions/drwater/dwhm/template.qmd b/_extensions/drwater/dwhm/template.qmd new file mode 100644 index 0000000..aaee17c --- /dev/null +++ b/_extensions/drwater/dwhm/template.qmd @@ -0,0 +1,16 @@ +--- +title: Untitled +format: + dwhm-html: default +author: Ming Su +date: last-modified +--- + +## Introduction + +*TODO* Create an example file that demonstrates the formatting and features of your format. + +## More Information + +You can learn more about controlling the appearance of HTML output here: + diff --git a/_extensions/drwater/dwinst/CL.docx b/_extensions/drwater/dwinst/CL.docx new file mode 100755 index 0000000..3727b07 Binary files /dev/null and b/_extensions/drwater/dwinst/CL.docx differ diff --git a/_extensions/drwater/dwinst/MS.docx b/_extensions/drwater/dwinst/MS.docx new file mode 100644 index 0000000..0165cf5 Binary files /dev/null and b/_extensions/drwater/dwinst/MS.docx differ diff --git a/_extensions/drwater/dwinst/RN.docx b/_extensions/drwater/dwinst/RN.docx new file mode 100755 index 0000000..a74403c Binary files /dev/null and b/_extensions/drwater/dwinst/RN.docx differ diff --git a/_extensions/drwater/dwinst/RP.docx b/_extensions/drwater/dwinst/RP.docx new file mode 100755 index 0000000..18580b1 Binary files /dev/null and b/_extensions/drwater/dwinst/RP.docx differ diff --git a/_extensions/drwater/dwinst/american-chemical-society.csl b/_extensions/drwater/dwinst/american-chemical-society.csl new file mode 100755 index 0000000..01f8c49 --- /dev/null +++ b/_extensions/drwater/dwinst/american-chemical-society.csl @@ -0,0 +1,280 @@ + + diff --git a/_extensions/drwater/dwinst/china-national-standard-gb-t-7714-2015-numeric.csl b/_extensions/drwater/dwinst/china-national-standard-gb-t-7714-2015-numeric.csl new file mode 100755 index 0000000..f7c84f0 --- /dev/null +++ b/_extensions/drwater/dwinst/china-national-standard-gb-t-7714-2015-numeric.csl @@ -0,0 +1,435 @@ + + diff --git a/_extensions/drwater/dwinst/clab-tooltip.js b/_extensions/drwater/dwinst/clab-tooltip.js new file mode 100644 index 0000000..900b133 --- /dev/null +++ b/_extensions/drwater/dwinst/clab-tooltip.js @@ -0,0 +1,418 @@ +// clab-tooltip.js - 完全隔离事件版本(修改后的显示位置逻辑) +(function() { + // 全局变量存储从 RN.html 提取的内容 + let rnContentCache = {}; + let isRnContentLoaded = false; + let activeTooltip = null; + let hideTimer = null; + let isMouseOverTooltip = false; + + // 从 RN.html 提取内容(保持不变) + async function loadRnContent() { + try { + console.log('加载 RN.html...'); + const response = await fetch('RN.html'); + if (!response.ok) throw new Error(`HTTP error: ${response.status}`); + + const htmlText = await response.text(); + const parser = new DOMParser(); + const rnDoc = parser.parseFromString(htmlText, 'text/html'); + + // 查找所有包含 data-options 的元素 + const optionElements = rnDoc.querySelectorAll('[data-options]'); + console.log(`找到 ${optionElements.length} 个 data-options 元素`); + + optionElements.forEach(element => { + const optionValue = element.getAttribute('data-options'); + if (!optionValue) return; + + // 向前查找最近的 blockquote + let prevElement = element.previousElementSibling; + let blockquote = null; + + // 先找前一个兄弟元素 + while (prevElement) { + if (prevElement.tagName === 'BLOCKQUOTE') { + blockquote = prevElement; + break; + } + prevElement = prevElement.previousElementSibling; + } + + // 如果没找到,向上查找 + if (!blockquote) { + let parent = element.parentElement; + while (parent) { + let sibling = parent.previousElementSibling; + while (sibling) { + if (sibling.tagName === 'BLOCKQUOTE') { + blockquote = sibling; + break; + } + sibling = sibling.previousElementSibling; + } + if (blockquote) break; + parent = parent.parentElement; + } + } + + if (blockquote) { + const lis = blockquote.querySelectorAll('li'); + if (lis.length > 0) { + const liContents = Array.from(lis).map(li => li.textContent.trim()); + + if (!rnContentCache[optionValue]) { + rnContentCache[optionValue] = []; + } + + // 存储所有引用 + rnContentCache[optionValue].push({ + contents: liContents + }); + } + } + }); + + isRnContentLoaded = true; + + console.log('内容加载完成'); + Object.keys(rnContentCache).forEach(key => { + console.log(`"${key}": ${rnContentCache[key].length} Questions`); + }); + + } catch (error) { + console.error('加载失败:', error); + } + } + + // 创建 tooltip(保持不变) + function createTooltip() { + const tooltip = document.createElement('div'); + tooltip.className = 'clab-tooltip'; + tooltip.id = 'clab-tooltip-element'; + + // 完全阻止所有事件冒泡 + const stopAllEvents = (e) => { + e.stopPropagation(); + e.stopImmediatePropagation(); + e.preventDefault(); + return false; + }; + + // 阻止所有可能的事件 + const events = [ + 'mousedown', 'mouseup', 'click', 'dblclick', + 'mousemove', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave', + 'wheel', 'scroll', + 'touchstart', 'touchmove', 'touchend', 'touchcancel', + 'pointerdown', 'pointermove', 'pointerup', 'pointercancel', + 'dragstart', 'dragover', 'drop' + ]; + + events.forEach(eventType => { + tooltip.addEventListener(eventType, stopAllEvents, true); // 捕获阶段 + tooltip.addEventListener(eventType, stopAllEvents, false); // 冒泡阶段 + }); + + // 允许 wheel 事件用于滚动,但阻止冒泡 + tooltip.addEventListener('wheel', function(e) { + e.stopPropagation(); + e.stopImmediatePropagation(); + // 允许默认的滚动行为 + }, { passive: false }); + + // 允许鼠标在 tooltip 内移动 + tooltip.addEventListener('mousemove', function(e) { + e.stopPropagation(); + }, { passive: true }); + + document.body.appendChild(tooltip); + return tooltip; + } + + // 显示 tooltip - 已修改位置逻辑 + function showTooltip(element, tooltip) { + const rect = element.getBoundingClientRect(); + const optionValue = element.getAttribute('data-options'); + + // 清空内容 + tooltip.innerHTML = ''; + + if (rnContentCache[optionValue] && rnContentCache[optionValue].length > 0) { + const entries = rnContentCache[optionValue]; + + // 标题显示选项 + const title = document.createElement('div'); + title.className = 'tooltip-title'; + title.textContent = optionValue; + if (entries.length > 1) { + title.textContent += ` (${entries.length} questions)`; + } + tooltip.appendChild(title); + + // 显示所有引用 + entries.forEach((entry, entryIndex) => { + const content = entry.contents; + + if (content.length === 1) { + // 单一条目 + const entryDiv = document.createElement('div'); + entryDiv.className = 'entry-single'; + + if (entries.length >= 1) { + entryDiv.innerHTML = `Q${entryIndex + 1}: ${content[0]}`; + } else { + entryDiv.textContent = content[0]; + } + + tooltip.appendChild(entryDiv); + } else { + // 多个条目 + const entryDiv = document.createElement('div'); + entryDiv.className = 'entry-multiple'; + + if (entries.length > 1) { + const header = document.createElement('div'); + header.className = 'q-header'; + header.textContent = `Q${entryIndex + 1}:`; + entryDiv.appendChild(header); + } + + const ol = document.createElement('ol'); + ol.className = 'q-list'; + + content.forEach((item, itemIndex) => { + const li = document.createElement('li'); + li.innerHTML = `${entryIndex + 1}.${itemIndex + 1} ${item}`; + ol.appendChild(li); + }); + + entryDiv.appendChild(ol); + tooltip.appendChild(entryDiv); + } + }); + } else { + // 没有找到内容 + const noContent = document.createElement('div'); + noContent.className = 'tooltip-no-content'; + noContent.textContent = '未找到相关内容'; + tooltip.appendChild(noContent); + } + + // 确保 tooltip 有合适的尺寸 + tooltip.style.position = 'fixed'; + tooltip.style.zIndex = '10000'; + tooltip.style.maxWidth = '400px'; + tooltip.style.maxHeight = '500px'; + tooltip.style.overflowY = 'auto'; + tooltip.style.boxSizing = 'border-box'; + + // 首先隐藏并获取尺寸 + tooltip.style.visibility = 'hidden'; + tooltip.classList.add('active'); + document.body.appendChild(tooltip); + + const tooltipWidth = Math.min(tooltip.scrollWidth, 400); + const tooltipHeight = Math.min(tooltip.scrollHeight, 500); + + tooltip.style.width = tooltipWidth + 'px'; + tooltip.style.height = 'auto'; + + const padding = 5; + const minDistanceFromEdge = 20; + + let left, top; + let position = 'right'; // 首选右侧 + + // 检查右侧空间 + if (rect.right + padding + tooltipWidth <= window.innerWidth - minDistanceFromEdge) { + // 右侧有足够空间 + left = rect.right + padding; + top = rect.top; + position = 'right'; + } else if (rect.left - padding - tooltipWidth >= minDistanceFromEdge) { + // 左侧有足够空间 + left = rect.left - padding - tooltipWidth; + top = rect.top; + position = 'left'; + } else { + // 两侧都没有足够空间,显示在下方 + left = Math.max( + minDistanceFromEdge, + Math.min( + rect.left + (rect.width - tooltipWidth) / 2, + window.innerWidth - tooltipWidth - minDistanceFromEdge + ) + ); + top = rect.bottom + padding; + position = 'bottom'; + } + + // 垂直边界检查 - 确保不超出屏幕 + if (top + tooltipHeight > window.innerHeight - minDistanceFromEdge) { + // 如果下方空间不足,尝试显示在上方 + if (rect.top - padding - tooltipHeight >= minDistanceFromEdge) { + top = rect.top - padding - tooltipHeight; + } else { + // 上下都不够,显示在中间 + top = Math.max( + minDistanceFromEdge, + Math.min( + top, + window.innerHeight - tooltipHeight - minDistanceFromEdge + ) + ); + } + } + + // 水平边界检查 - 确保不超出屏幕 + if (position === 'right' || position === 'left') { + left = Math.max( + minDistanceFromEdge, + Math.min(left, window.innerWidth - tooltipWidth - minDistanceFromEdge) + ); + } + + tooltip.style.left = left + 'px'; + tooltip.style.top = top + 'px'; + tooltip.style.visibility = 'visible'; + + // 添加一个小箭头指示方向 + tooltip.setAttribute('data-position', position); + + activeTooltip = tooltip; + isMouseOverTooltip = true; + + // 添加 overlay 防止 body 交互 + addOverlay(); + } + + // 添加半透明 overlay(保持不变) + function addOverlay() { + // 移除现有的 overlay + removeOverlay(); + + const overlay = document.createElement('div'); + overlay.id = 'tooltip-overlay'; + overlay.style.cssText = ` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 9999; + background: transparent; + pointer-events: none; + `; + document.body.appendChild(overlay); + + // 将 overlay 的 pointer-events 设为 auto,但阻止所有事件 + overlay.addEventListener('mousedown', stopEvent, true); + overlay.addEventListener('mouseup', stopEvent, true); + overlay.addEventListener('click', stopEvent, true); + overlay.addEventListener('mousemove', stopEvent, true); + overlay.addEventListener('wheel', stopEvent, true); + + function stopEvent(e) { + e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + return false; + } + } + + // 移除 overlay(保持不变) + function removeOverlay() { + const overlay = document.getElementById('tooltip-overlay'); + if (overlay) { + overlay.remove(); + } + } + + // 隐藏 tooltip(保持不变) + function hideTooltip() { + if (!isMouseOverTooltip && activeTooltip) { + activeTooltip.classList.remove('active'); + activeTooltip = null; + removeOverlay(); + } + } + + // 强制隐藏 tooltip(保持不变) + function forceHideTooltip() { + if (activeTooltip) { + activeTooltip.classList.remove('active'); + activeTooltip = null; + isMouseOverTooltip = false; + removeOverlay(); + } + } + + // 初始化(保持不变) + document.addEventListener('DOMContentLoaded', function() { + console.log('初始化 clab-tooltip'); + + const clabElements = document.querySelectorAll('.clab[data-options]'); + console.log(`找到 ${clabElements.length} 个 .clab 元素`); + + if (clabElements.length === 0) return; + + // 加载内容 + loadRnContent(); + + // 创建 tooltip + const tooltip = createTooltip(); + + // tooltip 鼠标进入/离开 + tooltip.addEventListener('mouseenter', function() { + isMouseOverTooltip = true; + clearTimeout(hideTimer); + }); + + tooltip.addEventListener('mouseleave', function() { + isMouseOverTooltip = false; + hideTimer = setTimeout(() => { + forceHideTooltip(); + }, 100); + }); + + // 为所有 .clab 元素添加事件监听 + clabElements.forEach(clab => { + clab.addEventListener('mouseenter', function() { + clearTimeout(hideTimer); + + setTimeout(() => { + if (isRnContentLoaded) { + showTooltip(this, tooltip); + } + }, 100); + }); + + clab.addEventListener('mouseleave', function() { + hideTimer = setTimeout(() => { + hideTooltip(); + }, 100); + }); + }); + + // ESC 键隐藏 tooltip + document.addEventListener('keydown', function(e) { + if (e.key === 'Escape' && activeTooltip) { + forceHideTooltip(); + } + }); + + // 点击其他地方隐藏 tooltip + document.addEventListener('click', function(e) { + if (activeTooltip && !activeTooltip.contains(e.target)) { + forceHideTooltip(); + } + }); + + // 窗口大小改变时隐藏 tooltip + window.addEventListener('resize', forceHideTooltip); + + // 滚动时隐藏 tooltip + window.addEventListener('scroll', forceHideTooltip); + }); +})(); diff --git a/_extensions/drwater/dwinst/drwater-white0.png b/_extensions/drwater/dwinst/drwater-white0.png new file mode 100644 index 0000000..cdb43c1 Binary files /dev/null and b/_extensions/drwater/dwinst/drwater-white0.png differ diff --git a/_extensions/drwater/dwinst/drwater-white0.svg b/_extensions/drwater/dwinst/drwater-white0.svg new file mode 100644 index 0000000..0a12a38 --- /dev/null +++ b/_extensions/drwater/dwinst/drwater-white0.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwinst/drwater.css b/_extensions/drwater/dwinst/drwater.css new file mode 100755 index 0000000..1c92fe3 --- /dev/null +++ b/_extensions/drwater/dwinst/drwater.css @@ -0,0 +1,384 @@ +.udot { + text-decoration-line: underline; + text-decoration-color: rgb(50, 50, 50); + text-decoration-style: dashed; + text-decoration-thickness: 1px; +} + +.good { + background-color: forestgreen; + color: lightyellow; +} + +.bad { + background-color: orangered; + color: lightyellow; +} + +.del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.5px; +} + + +.todo { + background-color: darkorange; + color: lightyellow; +} + +.com { + background-color: #0025ff; + font-weight: bold; + color: lightyellow; +} + +.add { + text-decoration-line: underline; + text-decoration-color: rgb(222 13 13); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + + +del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.0px; +} + + +ins { + text-decoration-color: rgb(222 93 93); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + + + +/* clab-style.css */ +.clab { + display: inline !important; + position: relative !important; + cursor: pointer !important; + padding: 2px 4px !important; + margin: 0 1px !important; + border-radius: 3px !important; + font: inherit !important; + color: #000000 !important; + text-decoration: none !important; + vertical-align: baseline !important; + line-height: inherit !important; + z-index: 1 !important; +} + +/* 随机背景色(使用预定义颜色) */ +.clab:nth-child(10n+1) { background-color: #E3F2FD !important; } +.clab:nth-child(10n+2) { background-color: #F3E5F5 !important; } +.clab:nth-child(10n+3) { background-color: #E8F5E9 !important; } +.clab:nth-child(10n+4) { background-color: #FFF3E0 !important; } +.clab:nth-child(10n+5) { background-color: #FCE4EC !important; } +.clab:nth-child(10n+6) { background-color: #E0F7FA !important; } +.clab:nth-child(10n+7) { background-color: #F1F8E9 !important; } +.clab:nth-child(10n+8) { background-color: #FFF8E1 !important; } +.clab:nth-child(10n+9) { background-color: #EDE7F6 !important; } +.clab:nth-child(10n+10) { background-color: #E8EAF6 !important; } + +/* 基础hover效果 */ +span.clab:hover { + outline: 2px solid rgba(0,0,0,0.2) !important; + outline-offset: 2px !important; + z-index: 1000 !important; +} + + + + +/* clab-tooltip 下方显示样式 */ +.clab-tooltip { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + color: white; + padding: 5px; + border: 1px solid #444; + /* -webkit-user-select: none; */ + position: fixed; + background: rgba(0, 0, 0, 0.95); + border-radius: 8px; + z-index: 10000; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), + 0 0 0 1px rgba(255, 255, 255, 0.1); + font-size: 14px; + line-height: 1.1; + max-width: 500px; + max-height: 800px; + overflow-y: auto; + opacity: 0; + visibility: hidden; + transition: opacity 0.2s ease, visibility 0.2s ease, transform 0.2s ease; + overscroll-behavior: contain; + pointer-events: auto !important; +} + + +/* Tooltip 箭头 */ +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border: 6px solid transparent; + border-bottom-color: #2a2a2a; + border-top: none; +} + +/* tooltip 在上方的箭头(向下) */ +.clab-tooltip.above .tooltip-arrow { + border-top-color: #2a2a2a; + border-bottom: none; +} + +/* 标题 */ +.tooltip-title { + font-weight: 600; + color: #FF9800; + margin-bottom: 6px; + padding-bottom: 4px; + border-bottom: 1px solid #444; + font-size: 14px; + font-family: monospace; + line-height: 0.8; + pointer-events: none; +} + +/* 单一条目 */ +.entry-single { + padding: 4px 4px; + margin-bottom: 6px; + background: rgba(255, 255, 255, 0.05); + border-radius: 6px; + border-left: 3px solid #ffffff; + line-height: 1.2; + cursor: default; +} + +/* Q标签样式 */ +.q-label { + display: inline-block; + color: #FF9800; + font-weight: 600; + margin-right: 8px; + min-width: 35px; +} + +/* 多个条目的引用 */ +.entry-multiple { + padding: 4px 4px; + margin-bottom: 6px; + background: rgba(255, 255, 255, 0.05); + border-radius: 6px; + border-left: 3px solid #ffffff; + line-height: 1.2; + cursor: default; +} + +/* 多引用标题 */ +.q-header { + color: #FF9800; + font-weight: 600; + margin-bottom: 8px; + font-size: 13px; + pointer-events: none; +} + +/* 列表 */ +.q-list { + margin: 0; + padding-left: 0; + list-style: none; +} + +.q-list li { + margin-bottom: 10px; + padding-left: 0; + line-height: 1.2; + position: relative; + cursor: default; + padding: 4px 0; +} + +/* 子标签样式 */ +.q-sublabel { + display: inline-block; + color: #4CAF50; + font-weight: 600; + margin-right: 2px; + min-width: 25px; +} + +/* 条目间空行 */ +/* .entry-spacer { */ +/* height: 12px; */ +/* pointer-events: none; */ +/* } */ + +/* 无内容 */ +.tooltip-no-content { + color: #ff6b6b; + font-style: italic; + padding: 20px; + text-align: center; + background: rgba(255, 107, 107, 0.05); + border-radius: 6px; + cursor: default; +} + +/* 滚动条 */ +.clab-tooltip::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +.clab-tooltip::-webkit-scrollbar-track { + background: #1a1a1a; + border-radius: 4px; +} + +.clab-tooltip::-webkit-scrollbar-thumb { + background: #4CAF50; + border-radius: 4px; +} + +.clab-tooltip::-webkit-scrollbar-thumb:hover { + background: #45a049; +} + + +/* 允许内容文本选择 */ +.entry-single, +.entry-multiple, +.q-list li { + user-select: text; + -webkit-user-select: text; +} + +/* 鼠标在 tooltip 上时的样式 */ +.clab-tooltip:hover { + cursor: default; +} + + +.clab-tooltip.active { + opacity: 1; + visibility: visible; + transform: translateY(0); +} + +.clab-tooltip ul { + margin: 0; + padding-left: 20px; +} + +.clab-tooltip li { + margin-bottom: 8px; + position: relative; +} + +.clab-tooltip .source { + margin-top: 10px; + padding-top: 10px; + border-top: 1px solid rgba(255,255,255,0.1); + font-size: 11px; + color: #aaa; + font-style: italic; +} + +.clab-tooltip .entry { + margin-bottom: 15px; + padding-bottom: 10px; + border-bottom: 1px solid rgba(255,255,255,0.1); +} + +.clab-tooltip .entry:last-child { + border-bottom: none; +} + + + +.rem { + background-color: darkorange; + color: lightyellow; + text-decoration-thickness: 2px; +} + + +#criticnav { + position: fixed; + z-index: 1100; + top: 0; + right: 0; + width: 120px; + border-bottom: solid 1px #ffffff; + margin: 0; + padding: 10; + background-color: rgb(143 38 38 / 95%); + color: #ffffff; + font-size: 12px; + font-family: "Helvetica Neue", helvetica, arial, sans-serif !important +} + +#criticnav ul { + list-style-type: none; + width: 90%; + margin: 0 auto; + padding: 0 +} + +#criticnav ul li { + display: block; + width: 100px; + min-width: 80px; + text-align: center; + padding: 5px 0 3px !important; + margin: 5px 2px !important; + line-height: 1em; + float: center; + text-transform: uppercase; + cursor: pointer; + border-radius: 20px; + border: 3px solid rgba(255,255,255,0); + color: #fff !important +} + +p { + text-align: left; /* 小屏幕左对齐 */ +} + +@media (min-width: 768px) { + p { + text-align: justify; + hyphens: auto; /* 自动断字 */ + -webkit-hyphens: auto; /* Safari 支持 */ + /* 可选:控制断字行为 */ + hyphenate-limit-chars: 6 3 2; /* 最小单词长度 前/后最小字符数 */ + } +} + +@media (min-width: 992px) { + body .page-columns { + display: grid; + gap: 0; + grid-template-columns: [screen-start] 0.5em [screen-start-inset] 0fr [page-start page-start-inset] 5px [body-start-outset] 5px [body-start] 0.5em [body-content-start] minmax(350px, calc(855px - 0em)) [body-content-end] 0.5em [body-end] 5px [body-end-outset] minmax(75px, 550px) [page-end-inset] 1px [page-end] 1fr [screen-end-inset] 0.5em [screen-end]; + } +} + + +@media (min-width: 1280px) { + body .page-columns { + display: grid; + gap: 0; + grid-template-columns: [screen-start] 3.5em [screen-start-inset] 2fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 3.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 400px) [page-end-inset] 35px [page-end] 2fr [screen-end-inset] 1.5em [screen-end]; + } +} diff --git a/_extensions/drwater/dwinst/drwater.scss b/_extensions/drwater/dwinst/drwater.scss new file mode 100644 index 0000000..93672cf --- /dev/null +++ b/_extensions/drwater/dwinst/drwater.scss @@ -0,0 +1,415 @@ +/*-- scss:defaults --*/ + +$theme: "drwater" !default; + +// +// Color system +// + +$white: #ffffff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #868e96 !default; +$gray-700: #495057 !default; +$gray-800: #373a3c !default; +$gray-900: #212529 !default; +$black: #000000 !default; + +$blue: #2780e3 !default; +$indigo: #6610f2 !default; +$purple: #170c3a !default; +$pink: #a52c60 !default; +$red: #cf4446 !default; +$orange: #ee6a24 !default; +$light-orange: #fb9e07 !default; +$yellow: #f6d645 !default; +$green: #118230 !default; +$teal: #20c997 !default; +$cyan: #3093cf !default; + +$primary: $pink !default; +$secondary: $gray-700 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $orange !default; +$danger: $red !default; +$light: $gray-400 !default; +$dark: $black !default; + +// Fonts + +$font-family-sans-serif: "Libre Franklin" !default; + +$headings-font-family: "Jost" !default; +$headings-font-weight: 600 !default; + +$navbar-font-family: "Jost" !default; +$toc-font-family: "Jost" !default; +$footer-font-family: "Jost" !default; + +// Body +$body-color: $gray-900 !default; + +// Links +$link-color: $orange !default; +$link-decoration: none !default; +$link-hover-color: $red !default; +$link-hover-decoration: underline !default; + +// Inline code +$code-bg: $gray-200 !default; +$code-color: $gray-900 !default; + +// Code copy +$btn-code-copy-color-active: $orange !default; + +// TOC +$toc-color: $orange; +$toc-font-size: 1em; + +// Navbar +$navbar-bg: $purple !default; +$navbar-fg: $white !default; +$navbar-hl: $light-orange !default; + +// Footer +$footer-bg: $gray-900 !default; +$footer-fg: $gray-300 !default; + +/*-- scss:rules --*/ + +$web-font-path: "https://fonts.googleapis.com/css2?family=Jost:ital,wght@0,100..900;1,100..900&family=Libre+Franklin:ital,wght@0,100..900;1,100..900&display=swap" !default; + +@if $web-font-path { + @import url($web-font-path); +} + +body { + -webkit-font-smoothing: antialiased; +} + +/* Logo 悬停效果 */ +.navbar-brand img { + transition: all 0.3s ease; + filter: brightness(0) invert(1); + + &:hover { + filter: brightness(0) invert(0.55) sepia(1) saturate(2000%) hue-rotate(-8deg) brightness(1.05) contrast(1.2); + transform: scale(1.05); + } +} + +// ============================================= +// 桌面端样式 - 使用悬停展开下拉菜单 +// ============================================= +@media (min-width: 992px) { + /* 导航栏主菜单项样式 */ + .navbar-nav .nav-item { + position: relative; + margin: 0 0.2rem; + + .nav-link { + position: relative; + color: $navbar-fg !important; + font-weight: 500; + padding: 0.75rem 1rem !important; + border-radius: 8px; + transition: all 0.3s ease; + z-index: 1; + + /* 玻璃效果背景 */ + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba($white, 0.1); + backdrop-filter: blur(10px); + border-radius: 8px; + opacity: 0; + transition: all 0.3s ease; + z-index: -1; + border: 1px solid rgba($white, 0.2); + } + + &:hover { + color: $light-orange !important; + transform: translateY(-2px); + + &::before { + opacity: 1; + background: rgba($white, 0.15); + backdrop-filter: blur(15px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); + } + } + + /* 激活状态 */ + &.active { + color: $light-orange !important; + font-weight: 600; + + &::before { + opacity: 1; + background: rgba($light-orange, 0.2); + backdrop-filter: blur(15px); + border: 1px solid rgba($light-orange, 0.3); + } + } + } + } + + /* 有下拉菜单的主菜单项特殊样式 */ + .navbar-nav .nav-item.dropdown { + .nav-link { + padding-right: 2rem !important; + + &::after { + position: absolute; + right: 1rem; + top: 50%; + transform: translateY(-50%); + transition: all 0.3s ease; + } + } + + &:hover .nav-link::before { + opacity: 1; + background: rgba($white, 0.2); + backdrop-filter: blur(20px); + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + + &:hover .nav-link::after { + transform: translateY(-50%) rotate(-180deg); + border-top-color: $light-orange; + } + } + + /* 桌面端下拉菜单悬停效果 */ + .navbar-nav .nav-item.dropdown:hover .dropdown-menu { + display: block !important; + opacity: 1 !important; + visibility: visible !important; + transform: translateY(0) !important; + } + + .dropdown-menu { + display: block; + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: all 0.3s ease; + background: rgba($purple, 0.98) !important; + backdrop-filter: blur(20px); + border: 1px solid rgba($white, 0.1); + border-top: none; + border-radius: 0 0 8px 8px; + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2); + margin-top: -1px; + padding: 0.5rem 0; + + &.show { + display: block; + opacity: 1; + visibility: visible; + transform: translateY(0); + } + } + + .dropdown-item { + color: $white !important; + font-family: $navbar-font-family; + padding: 0.75rem 1.5rem; + transition: all 0.2s ease; + position: relative; + + /* 下拉菜单项的玻璃效果 */ + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba($white, 0.05); + border-radius: 4px; + opacity: 0; + transition: all 0.2s ease; + z-index: -1; + } + + &:hover, &:focus { + color: $light-orange !important; + transform: translateX(5px); + background: transparent !important; + + &::before { + opacity: 1; + background: rgba($white, 0.1); + } + } + } + + /* 确保下拉菜单与主菜单视觉上连接 */ + .navbar-nav .nav-item.dropdown:hover .nav-link { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } +} + +// ============================================= +// 移动端样式 - 使用点击展开下拉菜单 +// ============================================= +@media (max-width: 991.98px) { + /* 完全重置移动端导航样式,使用 Bootstrap 默认行为 */ + .navbar-collapse { + background: rgba($purple, 0.98); + backdrop-filter: blur(10px); + border-top: 1px solid rgba($white, 0.1); + margin-top: 0.5rem; + padding: 0.5rem 0; + + .navbar-nav { + .nav-item { + margin: 0; + + .nav-link { + color: $navbar-fg !important; + padding: 1rem 1.5rem !important; + border-radius: 0; + transition: all 0.2s ease; + display: flex; + justify-content: space-between; + align-items: center; + + &:hover { + color: $light-orange !important; + background: rgba($white, 0.1); + } + + &.active { + color: $light-orange !important; + background: rgba($light-orange, 0.1); + font-weight: 600; + } + } + + /* 下拉菜单项样式 */ + &.dropdown { + .dropdown-toggle::after { + transition: transform 0.3s ease; + } + + &.show { + .dropdown-toggle { + color: $light-orange !important; + background: rgba($white, 0.15); + + &::after { + transform: rotate(-180deg); + } + } + } + + .dropdown-menu { + background: rgba(darken($purple, 5%), 0.95) !important; + border: none; + border-radius: 0; + padding: 0; + margin: 0; + position: static; + float: none; + display: none; + + &.show { + display: block !important; + } + } + } + } + } + } + + /* 移动端下拉菜单项 */ + .dropdown-item { + color: $navbar-fg !important; + padding: 0.875rem 1.5rem 0.875rem 2.5rem !important; + border-radius: 0; + transition: all 0.2s ease; + + &:hover, &:focus { + color: $light-orange !important; + background: rgba($white, 0.1) !important; + transform: none; + } + + &.active { + color: $light-orange !important; + background: rgba($light-orange, 0.1) !important; + font-weight: 600; + } + } + + /* 移动端导航栏折叠按钮 */ + .navbar-toggler { + border: 1px solid rgba($white, 0.2); + padding: 0.5rem 0.75rem; + + &:focus { + box-shadow: 0 0 0 0.2rem rgba($light-orange, 0.25); + } + + .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + } + } + + /* 禁用桌面端的悬停效果 */ + .navbar-nav .nav-item .nav-link::before { + display: none; + } + + .navbar-nav .nav-item.dropdown:hover .dropdown-menu { + display: none !important; + } +} + +// ============================================= +// 通用样式 +// ============================================= + +/* 导航栏整体样式 */ +.navbar { + backdrop-filter: blur(10px); + background: rgba($purple, 0.95) !important; + border-bottom: 1px solid rgba($white, 0.1); +} + +/* 为有下拉菜单的导航项添加视觉指示 */ +.navbar-nav .nav-item.dropdown > .nav-link::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} + +/* 确保 Bootstrap 的 JavaScript 交互正常工作 */ +.navbar-nav .dropdown-toggle::after { + display: inline-block !important; +} + +/* 修复移动端点击事件 */ +.navbar-nav .nav-item.dropdown .nav-link { + cursor: pointer; +} diff --git a/_extensions/drwater/dwinst/dweisvogel.tex b/_extensions/drwater/dwinst/dweisvogel.tex new file mode 100644 index 0000000..50b9664 --- /dev/null +++ b/_extensions/drwater/dwinst/dweisvogel.tex @@ -0,0 +1,1323 @@ +%% +% Copyright (c) 2017 - 2024, Pascal Wagler; +% Copyright (c) 2014 - 2024, John MacFarlane +% +% All rights reserved. +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions +% are met: +% +% - Redistributions of source code must retain the above copyright +% notice, this list of conditions and the following disclaimer. +% +% - Redistributions in binary form must reproduce the above copyright +% notice, this list of conditions and the following disclaimer in the +% documentation and/or other materials provided with the distribution. +% +% - Neither the name of John MacFarlane nor the names of other +% contributors may be used to endorse or promote products derived +% from this software without specific prior written permission. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +% "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +% FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +% COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +% INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +% LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +% ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE. +%% + +%% +% This is the Eisvogel pandoc LaTeX template. +% +% For usage information and examples visit the official GitHub page: +% https://github.com/Wandmalfarbe/pandoc-latex-template +%% + +% Options for packages loaded elsewhere +\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref} +\PassOptionsToPackage{hyphens}{url} +\PassOptionsToPackage{dvipsnames,svgnames,x11names,table}{xcolor} +$if(CJKmainfont)$ +\PassOptionsToPackage{space}{xeCJK} +$endif$ +% +\documentclass[ +$if(fontsize)$ + $fontsize$, +$endif$ +$if(papersize)$ + $papersize$paper, +$else$ + paper=a4, +$endif$ +$if(beamer)$ + ignorenonframetext, +$if(handout)$ + handout, +$endif$ +$if(aspectratio)$ + aspectratio=$aspectratio$, +$endif$ +$if(babel-lang)$ + $babel-lang$, +$endif$ +$endif$ +$for(classoption)$ + $classoption$$sep$, +$endfor$ + ,captions=tableheading +]{$if(beamer)$$documentclass$$else$$if(isbook)$scrbook$else$scrartcl$endif$$endif$} +$if(beamer)$ +$if(background-image)$ +\usebackgroundtemplate{% + \includegraphics[width=\paperwidth]{$background-image$}% +} +% In beamer background-image does not work well when other images are used, so this is the workaround +\pgfdeclareimage[width=\paperwidth,height=\paperheight]{background}{$background-image$} +\usebackgroundtemplate{\pgfuseimage{background}} +$endif$ + +\usepackage{pgfpages} +\setbeamertemplate{caption}[numbered] +\setbeamertemplate{caption label separator}{: } +\setbeamercolor{caption name}{fg=normal text.fg} +\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$ +$for(beameroption)$ +\setbeameroption{$beameroption$} +$endfor$ +% Prevent slide breaks in the middle of a paragraph +\widowpenalties 1 10000 +\raggedbottom +$if(section-titles)$ +\setbeamertemplate{part page}{ + \centering + \begin{beamercolorbox}[sep=16pt,center]{part title} + \usebeamerfont{part title}\insertpart\par + \end{beamercolorbox} +} +\setbeamertemplate{section page}{ + \centering + \begin{beamercolorbox}[sep=12pt,center]{section title} + \usebeamerfont{section title}\insertsection\par + \end{beamercolorbox} +} +\setbeamertemplate{subsection page}{ + \centering + \begin{beamercolorbox}[sep=8pt,center]{subsection title} + \usebeamerfont{subsection title}\insertsubsection\par + \end{beamercolorbox} +} +\AtBeginPart{ + \frame{\partpage} +} +\AtBeginSection{ + \ifbibliography + \else + \frame{\sectionpage} + \fi +} +\AtBeginSubsection{ + \frame{\subsectionpage} +} +$endif$ +$endif$ +$if(beamerarticle)$ +\usepackage{beamerarticle} % needs to be loaded first +$endif$ +\usepackage{amsmath,amssymb} +$if(linestretch)$ +\usepackage{setspace} +$else$ +% Use setspace anyway because we change the default line spacing. +% The spacing is changed early to affect the titlepage and the TOC. +\usepackage{setspace} +\setstretch{1.2} +$endif$ +\usepackage{iftex} +\ifPDFTeX + \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provide euro and other symbols +\else % if luatex or xetex +$if(mathspec)$ + \ifXeTeX + \usepackage{mathspec} % this also loads fontspec + \else + \usepackage{unicode-math} % this also loads fontspec + \fi +$else$ + \usepackage{unicode-math} % this also loads fontspec +$endif$ + \defaultfontfeatures{Scale=MatchLowercase}$-- must come before Beamer theme + \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} +\fi +$if(fontfamily)$ +$else$ +$-- Set default font before Beamer theme so the theme can override it +\usepackage{lmodern} +$endif$ +$-- Set Beamer theme before user font settings so they can override theme +$if(beamer)$ +$if(theme)$ +\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$} +$endif$ +$if(colortheme)$ +\usecolortheme{$colortheme$} +$endif$ +$if(fonttheme)$ +\usefonttheme{$fonttheme$} +$endif$ +$if(mainfont)$ +\usefonttheme{serif} % use mainfont rather than sansfont for slide text +$endif$ +$if(innertheme)$ +\useinnertheme{$innertheme$} +$endif$ +$if(outertheme)$ +\useoutertheme{$outertheme$} +$endif$ +$endif$ +$-- User font settings (must come after default font and Beamer theme) +$if(fontfamily)$ +\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} +$endif$ +\ifPDFTeX\else + % xetex/luatex font selection +$if(mainfont)$ + $if(mainfontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("mainfontfallback",{ + $for(mainfontfallback)$"$mainfontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$} +$endif$ +$if(sansfont)$ + $if(sansfontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("sansfontfallback",{ + $for(sansfontfallback)$"$sansfontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$$if(sansfontfallback)$,RawFeature={fallback=sansfontfallback}$endif$]{$sansfont$} +$endif$ +$if(monofont)$ + $if(monofontfallback)$ + \ifLuaTeX + \usepackage{luaotfload} + \directlua{luaotfload.add_fallback("monofontfallback",{ + $for(monofontfallback)$"$monofontfallback$"$sep$,$endfor$ + })} + \fi + $endif$ + \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$if(monofontfallback)$,RawFeature={fallback=monofontfallback}$endif$]{$monofont$} +$endif$ +$for(fontfamilies)$ + \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$} +$endfor$ +$if(mathfont)$ +$if(mathspec)$ + \ifXeTeX + \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \else + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \fi +$else$ + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} +$endif$ +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + \usepackage{xeCJK} + \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + $if(CJKsansfont)$ + \setCJKsansfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKsansfont$} + $endif$ + $if(CJKmonofont)$ + \setCJKmonofont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmonofont$} + $endif$ + \fi +$endif$ +$if(luatexjapresetoptions)$ + \ifLuaTeX + \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset} + \fi +$endif$ +$if(CJKmainfont)$ + \ifLuaTeX + \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec} + \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +\fi +$if(zero-width-non-joiner)$ +%% Support for zero-width non-joiner characters. +\makeatletter +\def\zerowidthnonjoiner{% + % Prevent ligatures and adjust kerning, but still support hyphenating. + \texorpdfstring{% + \TextOrMath{\nobreak\discretionary{-}{}{\kern.03em}% + \ifvmode\else\nobreak\hskip\z@skip\fi}{}% + }{}% +} +\makeatother +\ifPDFTeX + \DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner} +\else + \catcode`^^^^200c=\active + \protected\def ^^^^200c{\zerowidthnonjoiner} +\fi +%% End of ZWNJ support +$endif$ +% Use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\IfFileExists{microtype.sty}{% use microtype if available + \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype} + \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +$if(indent)$ +$else$ +\makeatletter +\@ifundefined{KOMAClassName}{% if non-KOMA class + \IfFileExists{parskip.sty}{% + \usepackage{parskip} + }{% else + \setlength{\parindent}{0pt} + \setlength{\parskip}{6pt plus 2pt minus 1pt}} +}{% if KOMA class + \KOMAoptions{parskip=half}} +\makeatother +$endif$ +$if(verbatim-in-note)$ +\usepackage{fancyvrb} +$endif$ +\usepackage{xcolor} +\definecolor{default-linkcolor}{HTML}{A50000} +\definecolor{default-filecolor}{HTML}{A50000} +\definecolor{default-citecolor}{HTML}{4077C0} +\definecolor{default-urlcolor}{HTML}{4077C0} +$if(footnotes-pretty)$ +% load footmisc in order to customize footnotes (footmisc has to be loaded before hyperref, cf. https://tex.stackexchange.com/a/169124/144087) +\usepackage[hang,flushmargin,bottom,multiple]{footmisc} +\setlength{\footnotemargin}{0.8em} % set space between footnote nr and text +\setlength{\footnotesep}{\baselineskip} % set space between multiple footnotes +\setlength{\skip\footins}{0.3cm} % set space between page content and footnote +\setlength{\footskip}{0.9cm} % set space between footnote and page bottom +$endif$ +$if(geometry)$ +$if(beamer)$ +\geometry{$for(geometry)$$geometry$$sep$,$endfor$} +$else$ +\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$else$ +$if(beamer)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering,$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$endif$ +$if(titlepage-logo)$ +\usepackage[export]{adjustbox} +\usepackage{graphicx} +$endif$ +$if(beamer)$ +\newif\ifbibliography +$endif$ +$if(listings)$ +\usepackage{listings} +\newcommand{\passthrough}[1]{#1} +\lstset{defaultdialect=[5.3]Lua} +\lstset{defaultdialect=[x86masm]Assembler} +$endif$ +$if(listings-no-page-break)$ +\usepackage{etoolbox} +\BeforeBeginEnvironment{lstlisting}{\par\noindent\begin{minipage}{\linewidth}} +\AfterEndEnvironment{lstlisting}{\end{minipage}\par\addvspace{\topskip}} +$endif$ +$if(lhs)$ +\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} +$endif$ +$if(highlighting-macros)$ +$highlighting-macros$ + +% Workaround/bugfix from jannick0. +% See https://github.com/jgm/pandoc/issues/4302#issuecomment-360669013) +% or https://github.com/Wandmalfarbe/pandoc-latex-template/issues/2 +% +% Redefine the verbatim environment 'Highlighting' to break long lines (with +% the help of fvextra). Redefinition is necessary because it is unlikely that +% pandoc includes fvextra in the default template. +\usepackage{fvextra} +\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,fontsize=$if(code-block-font-size)$$code-block-font-size$$else$\small$endif$,commandchars=\\\{\}} + +$endif$ + +% 为中文添加支持 by Ming Su +$if(CJK)$ +$if(isbook)$ +\usepackage{ctex} %调用中文字体宏包 +\usepackage{indentfirst} %调用首行缩进宏包 +\usepackage{ctex} % 确保中文字体支持 +\usepackage{zhnumber} +% 修改 chapter 格式为 "第X章" +% \renewcommand{\chapterformat}{第~\thechapter~章} +% \renewcommand{\chapterformat}{第\zhnumber{\thechapter}章} +\renewcommand{\chaptermarkformat}{第~\zhnumber{\thechapter}~章} +\renewcommand{\chapterformat}{第\zhnumber{\thechapter}章} +\renewcommand*{\chapterlinesformat}[3]{% + \parbox{\linewidth}{\centering #2~\quad~#3} % 居中 + "·" 分隔 + % 或改用冒号分隔: + % \parbox{\linewidth}{\centering #2:#3} +} +\RedeclareSectionCommand[ + beforeskip=1.5em plus 0.5em minus 0.5em, + afterskip=1em plus 0.2em, + font=\large\bfseries +]{section} +\usepackage{zhnumber} % 确保已加载(或直接用 ctex) +% 修改目录中的章节编号为中文 +\addtokomafont{chapterentry}{\normalfont} % 可选:调整目录字体 +\renewcommand*{\chapterformat}{第\zhnumber{\thechapter}章} % 正文标题格式 +\renewcommand*{\chaptermarkformat}{第\zhnumber{\thechapter}章\quad} % 页眉标题格式 +% 关键!覆盖目录中的章节编号 +\renewcommand{\addchaptertocentry}[2]{% + \addtocentrydefault{chapter}{第\zhnumber{#1}章}{#2}% +} +\RedeclareSectionCommand[ + tocentryindent=0pt, + tocentrynumwidth=3.5em % 确保编号区域足够宽 +]{chapter} +$endif$ +$endif$ + +$if(tables)$ +\usepackage{longtable,booktabs,array} +$if(multirow)$ +\usepackage{multirow} +$endif$ +\usepackage{calc} % for calculating minipage widths +$if(beamer)$ +\usepackage{caption} +% Make caption package work with longtable +\makeatletter +\def\fnum@table{\tablename~\thetable} +\makeatother +$else$ +% Correct order of tables after \paragraph or \subparagraph +\usepackage{etoolbox} +\makeatletter +\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} +\makeatother +% Allow footnotes in longtable head/foot +\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} +\makesavenoteenv{longtable} +$endif$ +$endif$ +% add backlinks to footnote references, cf. https://tex.stackexchange.com/questions/302266/make-footnote-clickable-both-ways +$if(footnotes-disable-backlinks)$ +$else$ +\usepackage{footnotebackref} +$endif$ +$if(graphics)$ +\usepackage{graphicx} +\makeatletter +% \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +% \def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +% \makeatother +% % Scale images if necessary, so that they will not overflow the page +% % margins by default, and it is still possible to overwrite the defaults +% % using explicit options in \includegraphics[width, height, ...]{} +% \setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +\newsavebox\pandoc@box +\newcommand*\pandocbounded[1]{% scales image to fit in text height/width + \sbox\pandoc@box{#1}% + \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% + \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% + \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both + \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% + \else\usebox{\pandoc@box}% + \fi% +} +% Set default figure placement to htbp +\makeatletter +\def\fps@figure{htbp} +\makeatother +% \makeatletter Old options from template, replaced with quarto defaults above +% \newsavebox\pandoc@box +% \newcommand*\pandocbounded[1]{% scales image to fit in text height/width +% \sbox\pandoc@box{#1}% +% \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% +% \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% +% \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both +% \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% +% \else\usebox{\pandoc@box}% +% \fi% +% } +% % Set default figure placement to htbp +% % Make use of float-package and set default placement for figures to H. +% % The option H means 'PUT IT HERE' (as opposed to the standard h option which means 'You may put it here if you like'). +% \usepackage{float} +% \floatplacement{figure}{$if(float-placement-figure)$$float-placement-figure$$else$H$endif$} +% \makeatother +$endif$ +$if(svg)$ +\usepackage{svg} +$endif$ +$if(strikeout)$ +$-- also used for underline +\ifLuaTeX + \usepackage{luacolor} + \usepackage[soul]{lua-ul} +\else +\usepackage{soul} +$if(beamer)$ + \makeatletter + \let\HL\hl + \renewcommand\hl{% fix for beamer highlighting + \let\set@color\beamerorig@set@color + \let\reset@color\beamerorig@reset@color + \HL} + \makeatother +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + % soul's \st doesn't work for CJK: + \usepackage{xeCJKfntef} + \renewcommand{\st}[1]{\sout{#1}} + \fi +$endif$ +\fi +$endif$ +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +$if(numbersections)$ +\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$} +$else$ +\setcounter{secnumdepth}{-\maxdimen} % remove section numbering +$endif$ +$if(subfigure)$ +\usepackage{subcaption} +$endif$ +$if(beamer)$ +$else$ +$if(block-headings)$ +% Make \paragraph and \subparagraph free-standing +\makeatletter +\ifx\paragraph\undefined\else + \let\oldparagraph\paragraph + \renewcommand{\paragraph}{ + \@ifstar + \xxxParagraphStar + \xxxParagraphNoStar + } + \newcommand{\xxxParagraphStar}[1]{\oldparagraph*{#1}\mbox{}} + \newcommand{\xxxParagraphNoStar}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else + \let\oldsubparagraph\subparagraph + \renewcommand{\subparagraph}{ + \@ifstar + \xxxSubParagraphStar + \xxxSubParagraphNoStar + } + \newcommand{\xxxSubParagraphStar}[1]{\oldsubparagraph*{#1}\mbox{}} + \newcommand{\xxxSubParagraphNoStar}[1]{\oldsubparagraph{#1}\mbox{}} +\fi +\makeatother +$endif$ +$endif$ +$if(pagestyle)$ +\pagestyle{$pagestyle$} +$endif$ +$if(csl-refs)$ +% definitions for citeproc citations +\NewDocumentCommand\citeproctext{}{} +\NewDocumentCommand\citeproc{mm}{% + \begingroup\def\citeproctext{#2}\cite{#1}\endgroup} +\makeatletter + % allow citations to break across lines + \let\@cite@ofmt\@firstofone + % avoid brackets around text for \cite: + \def\@biblabel#1{} + \def\@cite#1#2{{#1\if@tempswa , #2\fi}} +\makeatother +\newlength{\cslhangindent} +\setlength{\cslhangindent}{1.5em} +\newlength{\csllabelwidth} +\setlength{\csllabelwidth}{3em} +\newenvironment{CSLReferences}[2] % #1 hanging-indent, #2 entry-spacing + {\begin{list}{}{% + \setlength{\itemindent}{0pt} + \setlength{\leftmargin}{0pt} + \setlength{\parsep}{0pt} + % turn on hanging indent if param 1 is 1 + \ifodd #1 + \setlength{\leftmargin}{\cslhangindent} + \setlength{\itemindent}{-1\cslhangindent} + \fi + % set entry spacing + \setlength{\itemsep}{#2\baselineskip}}} + {\end{list}} +\usepackage{calc} +\newcommand{\CSLBlock}[1]{\hfill\break\parbox[t]{\linewidth}{\strut\ignorespaces#1\strut}} +\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{\strut#1\strut}} +\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{\strut#1\strut}} +\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1} +$endif$ +$if(lang)$ +\ifLuaTeX +\usepackage[bidi=basic]{babel} +\else +\usepackage[bidi=default]{babel} +\fi +$if(babel-lang)$ +\babelprovide[main,import]{$babel-lang$} +$if(mainfont)$ +\ifPDFTeX +\else +\babelfont{rm}[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$} +\fi +$endif$ +$endif$ +$for(babel-otherlangs)$ +\babelprovide[import]{$babel-otherlangs$} +$endfor$ +$for(babelfonts/pairs)$ +\babelfont[$babelfonts.key$]{rm}{$babelfonts.value$} +$endfor$ +% get rid of language-specific shorthands (see #6817): +\let\LanguageShortHands\languageshorthands +\def\languageshorthands#1{} +$if(selnolig-langs)$ +\ifLuaTeX + \usepackage[$for(selnolig-langs)$$it$$sep$,$endfor$]{selnolig} % disable illegal ligatures +\fi +$endif$ +$endif$ +$for(header-includes)$ +$header-includes$ +$endfor$ +$if(dir)$ +\ifPDFTeX + \TeXXeTstate=1 + \newcommand{\RL}[1]{\beginR #1\endR} + \newcommand{\LR}[1]{\beginL #1\endL} + \newenvironment{RTL}{\beginR}{\endR} + \newenvironment{LTR}{\beginL}{\endL} +\fi +$endif$ +$if(natbib)$ +\usepackage[$natbiboptions$]{natbib} +\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} +$endif$ +$if(biblatex)$ +\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} +$for(bibliography)$ +\addbibresource{$bibliography$} +$endfor$ +$endif$ +$if(nocite-ids)$ +\nocite{$for(nocite-ids)$$it$$sep$, $endfor$} +$endif$ +$if(csquotes)$ +\usepackage{csquotes} +$endif$ +\usepackage{bookmark} +\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available +\urlstyle{$if(urlstyle)$$urlstyle$$else$same$endif$} +$if(links-as-notes)$ +% Make links footnotes instead of hotlinks: +\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}} +$endif$ +$if(verbatim-in-note)$ +\VerbatimFootnotes % allow verbatim text in footnotes +$endif$ +\hypersetup{ +$if(title-meta)$ + pdftitle={$title-meta$}, +$endif$ +$if(author-meta)$ + pdfauthor={$author-meta$}, +$endif$ +$if(lang)$ + pdflang={$lang$}, +$endif$ +$if(subject)$ +pdfsubject={$subject$}, +$endif$ +$if(keywords)$ + pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$}, +$endif$ +$if(colorlinks)$ + colorlinks=true, + linkcolor={$if(linkcolor)$$linkcolor$$else$default-linkcolor$endif$}, + filecolor={$if(filecolor)$$filecolor$$else$default-filecolor$endif$}, + citecolor={$if(citecolor)$$citecolor$$else$default-citecolor$endif$}, + urlcolor={$if(urlcolor)$$urlcolor$$else$default-urlcolor$endif$}, +$else$ +$if(boxlinks)$ +$else$ + hidelinks, +$endif$ +$endif$ + breaklinks=true, + pdfcreator={LaTeX via pandoc with the Eisvogel template}} +$if(title)$ +\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} +$endif$ +$if(subtitle)$ +$if(beamer)$ +$else$ +\usepackage{etoolbox} +\makeatletter +\providecommand{\subtitle}[1]{% add subtitle to \maketitle + \apptocmd{\@title}{\par {\large #1 \par}}{}{} +} +\makeatother +$endif$ +\subtitle{$subtitle$} +$endif$ +\author{$for(author)$$author$$sep$ \and $endfor$} +\date{$date$} +$if(beamer)$ +$if(institute)$ +\institute{$for(institute)$$institute$$sep$ \and $endfor$} +$endif$ +$if(titlegraphic)$ +\titlegraphic{\includegraphics$if(titlegraphicoptions)$[$for(titlegraphicoptions)$$titlegraphicoptions$$sep$, $endfor$]$endif${$titlegraphic$}} +$endif$ +$if(logo)$ +\logo{\includegraphics{$logo$}} +$endif$ +$endif$ + + + +%% +%% added +%% + +$if(page-background)$ +\usepackage[pages=all]{background} +$endif$ + +% +% for the background color of the title page +% +$if(titlepage)$ +\usepackage{pagecolor} +\usepackage{afterpage} +$if(titlepage-background)$ +\usepackage{tikz} +$endif$ +$if(geometry)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering]{geometry} +$endif$ +$endif$ + +% +% break urls +% +\PassOptionsToPackage{hyphens}{url} + +% +% When using babel or polyglossia with biblatex, loading csquotes is recommended +% to ensure that quoted texts are typeset according to the rules of your main language. +% +\usepackage{csquotes} + +% +% captions +% +\definecolor{caption-color}{HTML}{777777} +$if(beamer)$ +$else$ +\usepackage[font={stretch=1.2}, textfont={color=caption-color}, position=top, skip=4mm, labelfont=bf, singlelinecheck=false, justification=$if(caption-justification)$$caption-justification$$else$raggedright$endif$]{caption} +\setcapindent{0em} +$endif$ + +% +% blockquote +% +\definecolor{blockquote-border}{RGB}{221,221,221} +\definecolor{blockquote-text}{RGB}{119,119,119} +\usepackage{mdframed} +\newmdenv[rightline=false,bottomline=false,topline=false,linewidth=3pt,linecolor=blockquote-border,skipabove=\parskip]{customblockquote} +\renewenvironment{quote}{\begin{customblockquote}\list{}{\rightmargin=0em\leftmargin=0em}% +\item\relax\color{blockquote-text}\ignorespaces}{\unskip\unskip\endlist\end{customblockquote}} + +% +% Source Sans Pro as the default font family +% Source Code Pro for monospace text +% +% 'default' option sets the default +% font family to Source Sans Pro, not \sfdefault. +% +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + $if(fontfamily)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + $endif$ +\else % if not pdftex + $if(mainfont)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + + % XeLaTeX specific adjustments for straight quotes: https://tex.stackexchange.com/a/354887 + % This issue is already fixed (see https://github.com/silkeh/latex-sourcecodepro/pull/5) but the + % fix is still unreleased. + % TODO: Remove this workaround when the new version of sourcecodepro is released on CTAN. + \ifxetex + \makeatletter + \defaultfontfeatures[\ttfamily] + { Numbers = \sourcecodepro@figurestyle, + Scale = \SourceCodePro@scale, + Extension = .otf } + \setmonofont + [ UprightFont = *-\sourcecodepro@regstyle, + ItalicFont = *-\sourcecodepro@regstyle It, + BoldFont = *-\sourcecodepro@boldstyle, + BoldItalicFont = *-\sourcecodepro@boldstyle It ] + {SourceCodePro} + \makeatother + \fi + $endif$ +\fi + + +% setup for chinese font, by Ming +\setCJKmainfont{$CJKmainfont$}[BoldFont=$CJKboldfont$, ItalicFont=$CJKitalicfont$] + +% +% heading color +% +\definecolor{heading-color}{RGB}{40,40,40} +$if(beamer)$ +$else$ +\addtokomafont{section}{\color{heading-color}} +$endif$ +% When using the classes report, scrreprt, book, +% scrbook or memoir, uncomment the following line. +%\addtokomafont{chapter}{\color{heading-color}} + +% +% variables for title, author and date +% +$if(beamer)$ +$else$ +\usepackage{titling} +\title{$title$} +\author{$for(author)$$author$$sep$, $endfor$} +\date{$date$} +$endif$ + +% +% tables +% +$if(tables)$ + +\definecolor{table-row-color}{HTML}{F5F5F5} +\definecolor{table-rule-color}{HTML}{999999} + +%\arrayrulecolor{black!40} +\arrayrulecolor{table-rule-color} % color of \toprule, \midrule, \bottomrule +\setlength\heavyrulewidth{0.3ex} % thickness of \toprule, \bottomrule +\renewcommand{\arraystretch}{1.3} % spacing (padding) + +$if(table-use-row-colors)$ +% Unfortunately the colored cells extend beyond the edge of the +% table because pandoc uses @-expressions (@{}) like so: +% +% \begin{longtable}[]{@{}ll@{}} +% \end{longtable} +% +% https://en.wikibooks.org/wiki/LaTeX/Tables#.40-expressions +\usepackage{etoolbox} +\AtBeginEnvironment{longtable}{\rowcolors{2}{}{table-row-color!100}} +\preto{\toprule}{\hiderowcolors}{}{} +\appto{\endhead}{\showrowcolors}{}{} +\appto{\endfirsthead}{\showrowcolors}{}{} +$endif$ +$endif$ + +% +% remove paragraph indentation +% +% \setlength{\parindent}{0pt} +$if(parindent)$ +\setlength{\parindent}{2em} %设置首行缩进为2字符 +$else$ +\setlength{\parindent}{0pt} +$endif$ +\setlength{\parskip}{6pt plus 2pt minus 1pt} +\setlength{\emergencystretch}{3em} % prevent overfull lines + + + +% +% +% Listings +% +% + +$if(listings)$ + +% +% general listing colors +% +\definecolor{listing-background}{HTML}{F7F7F7} +\definecolor{listing-rule}{HTML}{B3B2B3} +\definecolor{listing-numbers}{HTML}{B3B2B3} +\definecolor{listing-text-color}{HTML}{000000} +\definecolor{listing-keyword}{HTML}{435489} +\definecolor{listing-keyword-2}{HTML}{1284CA} % additional keywords +\definecolor{listing-keyword-3}{HTML}{9137CB} % additional keywords +\definecolor{listing-identifier}{HTML}{435489} +\definecolor{listing-string}{HTML}{00999A} +\definecolor{listing-comment}{HTML}{8E8E8E} + +\lstdefinestyle{eisvogel_listing_style}{ + language = java, +$if(listings-disable-line-numbers)$ + xleftmargin = 0.6em, + framexleftmargin = 0.4em, +$else$ + numbers = left, + xleftmargin = 2.7em, + framexleftmargin = 2.5em, +$endif$ + backgroundcolor = \color{listing-background}, + basicstyle = \color{listing-text-color}\linespread{1.0}% + \lst@ifdisplaystyle% + $if(code-block-font-size)$$code-block-font-size$$else$\small$endif$% + \fi\ttfamily{}, + breaklines = true, + frame = single, + framesep = 0.19em, + rulecolor = \color{listing-rule}, + frameround = ffff, + tabsize = 4, + numberstyle = \color{listing-numbers}, + aboveskip = 1.0em, + belowskip = 0.1em, + abovecaptionskip = 0em, + belowcaptionskip = 1.0em, + keywordstyle = {\color{listing-keyword}\bfseries}, + keywordstyle = {[2]\color{listing-keyword-2}\bfseries}, + keywordstyle = {[3]\color{listing-keyword-3}\bfseries\itshape}, + sensitive = true, + identifierstyle = \color{listing-identifier}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + showstringspaces = false, + escapeinside = {/*@}{@*/}, % Allow LaTeX inside these special comments + literate = + {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 + {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 + {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 + {À}{{\`A}}1 {È}{{\`E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 + {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1 + {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1 + {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1 + {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1 + {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1 + {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1 + {€}{{\EUR}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1 + {»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1 + {…}{{\ldots}}1 {≥}{{>=}}1 {≤}{{<=}}1 {„}{{\glqq}}1 {“}{{\grqq}}1 + {”}{{''}}1 +} +\lstset{style=eisvogel_listing_style} + +% +% Java (Java SE 12, 2019-06-22) +% +\lstdefinelanguage{Java}{ + morekeywords={ + % normal keywords (without data types) + abstract,assert,break,case,catch,class,continue,default, + do,else,enum,exports,extends,final,finally,for,if,implements, + import,instanceof,interface,module,native,new,package,private, + protected,public,requires,return,static,strictfp,super,switch, + synchronized,this,throw,throws,transient,try,volatile,while, + % var is an identifier + var + }, + morekeywords={[2] % data types + % primitive data types + boolean,byte,char,double,float,int,long,short, + % String + String, + % primitive wrapper types + Boolean,Byte,Character,Double,Float,Integer,Long,Short + % number types + Number,AtomicInteger,AtomicLong,BigDecimal,BigInteger,DoubleAccumulator,DoubleAdder,LongAccumulator,LongAdder,Short, + % other + Object,Void,void + }, + morekeywords={[3] % literals + % reserved words for literal values + null,true,false, + }, + sensitive, + morecomment = [l]//, + morecomment = [s]{/*}{*/}, + morecomment = [s]{/**}{*/}, + morestring = [b]", + morestring = [b]', +} + +\lstdefinelanguage{XML}{ + morestring = [b]", + moredelim = [s][\bfseries\color{listing-keyword}]{<}{\ }, + moredelim = [s][\bfseries\color{listing-keyword}]{}, + moredelim = [l][\bfseries\color{listing-keyword}]{/>}, + moredelim = [l][\bfseries\color{listing-keyword}]{>}, + morecomment = [s]{}, + morecomment = [s]{}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + identifierstyle = \color{listing-identifier} +} +$endif$ + +% +% header and footer +% +$if(beamer)$ +$else$ +$if(disable-header-and-footer)$ +$else$ +\usepackage[headsepline,footsepline]{scrlayer-scrpage} + +\newpairofpagestyles{eisvogel-header-footer}{ + \clearpairofpagestyles + \ihead*{$if(header-left)$$header-left$$else$$title$$endif$} + \chead*{$if(header-center)$$header-center$$else$$endif$} + \ohead*{$if(header-right)$$header-right$$else$$date$$endif$} + \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot*{$if(footer-center)$$footer-center$$else$$endif$} + \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \addtokomafont{pageheadfoot}{\upshape} +} +\pagestyle{eisvogel-header-footer} + +\newpairofpagestyles{eisvogel-chapterpage-header-footer}{ + \clearpairofpagestyles + \setheadtopline{0pt} % 移除页眉顶部的横线(如果有) + \setheadsepline{0pt} + \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot*{$if(footer-center)$$footer-center$$else$$endif$} + \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \addtokomafont{pageheadfoot}{\upshape} +} + + +$if(isbook)$ +% \deftripstyle{ChapterStyle}{}{}{}{}{\pagemark}{} +% \renewcommand*{\chapterpagestyle}{ChapterStyle} +\renewcommand*{\chapterpagestyle}{eisvogel-chapterpage-header-footer} +$endif$ + + +$if(page-background)$ +\backgroundsetup{ +scale=1, +color=black, +opacity=$if(page-background-opacity)$$page-background-opacity$$else$0.2$endif$, +angle=0, +contents={% + \includegraphics[width=\paperwidth,height=\paperheight]{$page-background$} + }% +} +$endif$ +$endif$ +$endif$ + +% watermark +$if(watermark)$ +\usepackage{draftwatermark,xcolor} +\SetWatermarkText{\textcolor{$if(watermark-color)$$watermark-color$$else$gray!3$endif$}{$watermark$}} +\SetWatermarkScale{1.2} % 缩小水印尺寸(数值越小越密集) +\SetWatermarkAngle{45} % 斜角排列(经典水印样式) +\SetWatermarkLightness{0.99} % 亮度调节 +$endif$ + +%% +%% end added +%% + +\begin{document} + +%% +%% begin titlepage +%% +$if(beamer)$ +$else$ +$if(titlepage)$ +\begin{titlepage} +$if(titlepage-background)$ +\newgeometry{top=2cm, right=4cm, bottom=3cm, left=4cm} +$else$ +\newgeometry{left=2cm} +$endif$ +$if(titlepage-color)$ +\definecolor{titlepage-color}{HTML}{$titlepage-color$} +\newpagecolor{titlepage-color}\afterpage{\restorepagecolor} +$endif$ +$if(titlepage-background)$ +\tikz[remember picture,overlay] \node[inner sep=0pt] at (current page.center){\includegraphics[width=\paperwidth,height=\paperheight]{$titlepage-background$}}; +$endif$ +\newcommand{\colorRule}[3][black]{\textcolor[HTML]{#1}{\rule{#2}{#3}}} + +\NewDocumentEnvironment{dynalign}{} + {\begin{$if(titlepage-halign)$$titlepage-halign$$else$center$endif$}} + {\end{$if(titlepage-halign)$$titlepage-halign$$else$center$endif$}} + +\begin{dynalign} +\noindent +\\[-1em] +\color[HTML]{$if(titlepage-text-color)$$titlepage-text-color$$else$5F5F5F$endif$} +\makebox[0pt][l]{\colorRule[$if(titlepage-rule-color)$$titlepage-rule-color$$else$435488$endif$]{1.3\textwidth}{$if(titlepage-rule-height)$$titlepage-rule-height$$else$4$endif$pt}} +\par +\noindent + +$if(titlepage-logo)$ +\noindent +\vskip $if(logo-vskip)$$logo-vskip$$else$-8em$endif$ +\hskip $if(logo-hskip)$$logo-hskip$$else$-6em$endif$ +\includegraphics[width=$if(logo-width)$$logo-width$$else$35mm$endif$, left]{$titlepage-logo$} +$endif$ + +$if(titlepage-background)$ +% The titlepage with a background image has other text spacing and text size +{ + \setstretch{2} + \vfill + \vskip -8em + $if(title-vskip)$ + \vskip $title-vskip$ + $endif$ + $if(title-hskip)$ + \vskip $title-hskip$ + $endif$ + \noindent { + $if(title-size)$ + \$title-size$ + $else$ + \huge + $endif$ +\textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + { + $if(subtitle-size)$ + \$subtitle-size$ + $else$ + \Large + $endif$ + \textsf{$subtitle$}} + $endif$ + \vskip 2em + $if(author-vskip)$ + \vskip $author-vskip$ + $endif$ + \noindent { + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ + +\textsf{$for(author)$$author$$sep$, $endfor$} +\vskip 0.6em + $if(date-vskip)$ + \vskip $date-vskip$ + $endif$ +{\textsf{$if(institute)$$institute$\vskip 0.6em$endif$$date$}} +} + \vfill +} +$else$ +{ + \setstretch{1.4} + \vfill + \vskip 8em + $if(title-vskip)$ + \vskip $title-vskip$ + $endif$ + $if(title-hskip)$ + \vskip $title-hskip$ + $endif$ + \noindent {\huge \textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + {\Large \textsf{$subtitle$}} + $endif$ + \vskip 4em + $if(author-vskip)$ + \vskip $author-vskip$ + $endif$ + \noindent { + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ + +\textsf{$for(author)$$author$$sep$, $endfor$} +\vskip 0.6em + $if(date-vskip)$ + \vskip $date-vskip$ + $endif$ +} + \vfill +} +$endif$ + + +$if(titlepage-background)$ +$else$ + + $if(author-size)$ + $author-size$ + $else$ + \Large + $endif$ +{\textsf{$if(institute)$$institute$\vskip 0.6em$endif$$date$}} +$endif$ +\end{dynalign} +\end{titlepage} +\restoregeometry +\pagenumbering{arabic} +$endif$ +$endif$ + + + +%% +%% end titlepage +%% + +$if(has-frontmatter)$ +\frontmatter +$endif$ +$if(title)$ +$if(beamer)$ +\frame{\titlepage} +% don't generate the default title +% $else$ +% \maketitle +$endif$ +$if(abstract)$ +\begin{abstract} +$abstract$ +\end{abstract} +$endif$ +$endif$ + +$if(first-chapter)$ +\setcounter{chapter}{$first-chapter$} +\addtocounter{chapter}{-1} +$endif$ + +$for(include-before)$ +$include-before$ + +$endfor$ +$if(toc)$ +$if(toc-title)$ +\renewcommand*\contentsname{$toc-title$} +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks] +$if(toc-title)$ + \frametitle{$toc-title$} +$endif$ + \setcounter{tocdepth}{$toc-depth$} + \tableofcontents +\end{frame} +$if(toc-own-page)$ +\newpage +$endif$ +$else$ +{ +$if(colorlinks)$ +\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$} +$endif$ +\setcounter{tocdepth}{$toc-depth$} +\tableofcontents +$if(toc-own-page)$ +\newpage +$endif$ +} +$endif$ +$endif$ +$if(lof)$ +\listoffigures +$endif$ +$if(lot)$ +\listoftables +$endif$ +$if(linestretch)$ +\setstretch{$linestretch$} +$endif$ +$if(has-frontmatter)$ +\mainmatter +$endif$ +$body$ + +$if(has-frontmatter)$ +\backmatter +$endif$ +$if(natbib)$ +$if(bibliography)$ +$if(biblio-title)$ +$if(has-chapters)$ +\renewcommand\bibname{$biblio-title$} +$else$ +\renewcommand\refname{$biblio-title$} +$endif$ +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue +$endif$ + \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} +$if(beamer)$ +\end{frame} +$endif$ + +$endif$ +$endif$ +$if(biblatex)$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue + \printbibliography[heading=none] +\end{frame} +$else$ +\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ +$endif$ + +$endif$ +$for(include-after)$ +$include-after$ + +$endfor$ +\end{document} diff --git a/_extensions/drwater/dwinst/elsevier-harvard.csl b/_extensions/drwater/dwinst/elsevier-harvard.csl new file mode 100755 index 0000000..5d88c51 --- /dev/null +++ b/_extensions/drwater/dwinst/elsevier-harvard.csl @@ -0,0 +1,239 @@ + + diff --git a/_extensions/drwater/dwinst/global-change-biology.csl b/_extensions/drwater/dwinst/global-change-biology.csl new file mode 100644 index 0000000..5b5b69b --- /dev/null +++ b/_extensions/drwater/dwinst/global-change-biology.csl @@ -0,0 +1,16 @@ + + diff --git a/_extensions/drwater/dwinst/journal-of-hazardous-materials.csl b/_extensions/drwater/dwinst/journal-of-hazardous-materials.csl new file mode 100644 index 0000000..0f98259 --- /dev/null +++ b/_extensions/drwater/dwinst/journal-of-hazardous-materials.csl @@ -0,0 +1,165 @@ + + diff --git a/_extensions/drwater/dwinst/nature-biotechnology.csl b/_extensions/drwater/dwinst/nature-biotechnology.csl new file mode 100644 index 0000000..216c8b9 --- /dev/null +++ b/_extensions/drwater/dwinst/nature-biotechnology.csl @@ -0,0 +1,17 @@ + + diff --git a/_extensions/drwater/dwinst/nature.csl b/_extensions/drwater/dwinst/nature.csl new file mode 100644 index 0000000..7b058ba --- /dev/null +++ b/_extensions/drwater/dwinst/nature.csl @@ -0,0 +1,154 @@ + + diff --git a/_extensions/drwater/dwinst/pnas.csl b/_extensions/drwater/dwinst/pnas.csl new file mode 100644 index 0000000..1911e9e --- /dev/null +++ b/_extensions/drwater/dwinst/pnas.csl @@ -0,0 +1,229 @@ + + diff --git a/_extensions/drwater/dwinst/rceeslogo.pdf b/_extensions/drwater/dwinst/rceeslogo.pdf new file mode 100644 index 0000000..51d1a45 Binary files /dev/null and b/_extensions/drwater/dwinst/rceeslogo.pdf differ diff --git a/_extensions/drwater/dwinst/rceeslogo.svg b/_extensions/drwater/dwinst/rceeslogo.svg new file mode 100644 index 0000000..44431ff --- /dev/null +++ b/_extensions/drwater/dwinst/rceeslogo.svg @@ -0,0 +1,5 @@ + + viewBox="0 0 621 690"> + + + diff --git a/_extensions/drwater/dwinst/rceeslonglogo.pdf b/_extensions/drwater/dwinst/rceeslonglogo.pdf new file mode 100644 index 0000000..50017f7 Binary files /dev/null and b/_extensions/drwater/dwinst/rceeslonglogo.pdf differ diff --git a/_extensions/drwater/dwinst/rceeslonglogo.svg b/_extensions/drwater/dwinst/rceeslonglogo.svg new file mode 100644 index 0000000..013b69d --- /dev/null +++ b/_extensions/drwater/dwinst/rceeslonglogo.svg @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwinst/slides.scss b/_extensions/drwater/dwinst/slides.scss new file mode 100644 index 0000000..17a8585 --- /dev/null +++ b/_extensions/drwater/dwinst/slides.scss @@ -0,0 +1,33 @@ +/*-- scss:defaults --*/ + +/*-- scss:rules --*/ + +:root { + --r-background-color: #fff; + --r-main-font: Source Sans Pro, simhei, microsoft yahei; + --r-main-font-size: 32px; // 正文字体大小 + --r-main-color: #434343; // 正文颜色,松烟墨:#434343 乌墨:#1A1A1A;#006D6D + --r-block-margin: 12px; + --r-heading-margin: 0 0 12px 0; + --r-heading-font: Source Sans Pro, simhei, microsoft yahei; + --r-heading-color: #0c4c8a; //标题颜色:深青蓝色:296364;海军蓝或藏青色:0c4c8a;深青色:006D6D;钻蓝色:0F52BA;酒红:800020 + --r-heading-line-height: 1.2em; + --r-heading-letter-spacing: normal; + --r-heading-text-transform: none; + --r-heading-text-shadow: none; + --r-heading-font-weight: 900; + --r-heading1-text-shadow: none; + --r-heading1-size: 2.5em; + --r-heading2-size: 1.6em; + --r-heading3-size: 1.3em; + --r-heading4-size: 1em; + --r-code-font: SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, + Courier New, monospace; + --r-link-color: #ef562d; + --r-link-color-dark: #ef562d; + --r-link-color-hover: #d13076; + --r-selection-background-color: #98bdef; + --r-selection-color: #fff; + --quarto-hl-fu-color: #c53800; +} + diff --git a/_extensions/drwater/dwinst/the-isme-j.csl b/_extensions/drwater/dwinst/the-isme-j.csl new file mode 100755 index 0000000..730aefc --- /dev/null +++ b/_extensions/drwater/dwinst/the-isme-j.csl @@ -0,0 +1,181 @@ + + diff --git a/_extensions/drwater/dwinst/water-research.csl b/_extensions/drwater/dwinst/water-research.csl new file mode 100644 index 0000000..69e34f5 --- /dev/null +++ b/_extensions/drwater/dwinst/water-research.csl @@ -0,0 +1,14 @@ + + diff --git a/_extensions/drwater/dwms/.gitignore b/_extensions/drwater/dwms/.gitignore new file mode 100644 index 0000000..dc719c9 --- /dev/null +++ b/_extensions/drwater/dwms/.gitignore @@ -0,0 +1,16 @@ +.Rproj.user +.Rhistory +.RData +.Ruserdata +site_libs/ +/.quarto/ +site_libs/ +BB/Ref.bib +_variables.yml +_freeze/ +www/ +.source_state +*_files/ +/*.pdf +/*.html + diff --git a/_extensions/drwater/dwms/MS.qmd b/_extensions/drwater/dwms/MS.qmd new file mode 100644 index 0000000..34b821d --- /dev/null +++ b/_extensions/drwater/dwms/MS.qmd @@ -0,0 +1,56 @@ +--- +msname: MS +smname: SM +isMS: true +date: "" +# bibliography: [../BB/Ref.bib, ../BB/localRef.bib] +# csl: _extensions/drwater/dwms/inst/nature.csl +endfloat: true +doublespacing: true +linenumbers: true +latex-clean: false # to keep aux +format: + dwms-html: default + dwms-docx: default + dwms-pdf: default +# filters: +# - latex-environment +# - authoraffil +# lightbox: auto +# commands: [clab] +--- + + +```{r} +#| include: false +#| cache: false + +lang <- "en" +isRendering <- isTRUE(getOption("knitr.in.progress")) +require(tidyverse) +require(drwateR) +require(patchwork) +rmdify::rmd_init() +dwfun::init() +``` + + +{{< pagebreak >}} + +# Abstract {-} + +This is a demo of abstract. + + +{{< pagebreak >}} + + + +# References {-} + +::: {#refs} +::: + +{{< pagebreak >}} + + diff --git a/_extensions/drwater/dwms/RN.qmd b/_extensions/drwater/dwms/RN.qmd new file mode 100644 index 0000000..3d6b890 --- /dev/null +++ b/_extensions/drwater/dwms/RN.qmd @@ -0,0 +1,62 @@ +--- +subtitle: "Revision Note" +msname: MS +smname: SM +isRN: true +date: "" +# bibliography: [../BB/Ref.bib, ../BB/localRef.bib] +# csl: _extensions/drwater/dwinst/nature.csl +doublespacing: true +format: + dwms-html: default + dwms-docx: default + dwms-pdf: + number-sections: true +# filters: +# - latex-environment +# - authoraffil +# lightbox: auto +# commands: [clab] +--- + +```{r} +#| include: false +#| cache: false +lang <- "en" +RM <- "F" # global rendermode, L: load pdata; F: fast load pdf +isrendering <- isTRUE(getOption('knitr.in.progress')) +require(tidyverse) +require(patchwork) +require(drwateR) +rmdify::rmd_init() +``` + +# Response to Editor + +> 0. I very much regret to have to tell you that publication in our journal is not recommended. An explanation for this decision is given in the attached review reports (and on https://www.editorialmanager.com/wr/). I hope that the comments contained therein will be of use to you. + +**Response/Action:** + +Thank you. + +::: {#rfg-figr1} + +```{r} +plot(1) +``` + +A figure in RN +::: + + + +# Reviewer #1: + +> 0. COMMENT 1 + +**Response/Action:** + +Thank you very much for your revision. We made changes as shown below. + +`r cref("r1q0101")` + diff --git a/_extensions/drwater/dwms/SM.qmd b/_extensions/drwater/dwms/SM.qmd new file mode 100644 index 0000000..735145b --- /dev/null +++ b/_extensions/drwater/dwms/SM.qmd @@ -0,0 +1,65 @@ +--- +msname: MS +smname: SM +isSM: true +# bibliography: [../BB/Ref.bib, ../BB/localRef.bib] +# csl: _extensions/drwater/dwinst/nature.csl +subtitle: "Supplementary Information" +date: "" +latex-clean: false # to keep aux +format: + dwms-html: default + dwms-docx: default + dwms-pdf: + toc: false # 手动设置了 +# filters: +# - latex-environment +# - authoraffil +# lightbox: auto +# commands: [clab] +--- + +\thispagestyle{empty} + +```{r} +#| include: false +#| cache: false +options(tinytex.clean = FALSE) +lang <- "en" +RM <- "F" # global rendermode, L: load pdata; F: fast load pdf +isRendering <- isTRUE(getOption('knitr.in.progress')) +require(tidyverse) +require(patchwork) +require(drwateR) +rmdify::rmd_init() +``` + + +Figures and/or tables are provided below as the supplementary evidences to the main text. + + +```{=latex} +\clearpage +{ +\hypersetup{linkcolor=black} +\setcounter{tocdepth}{3} +\tableofcontents +} +``` + + +# [@sfg-demo] + +::: {#sfg-demo} + +```{r} +#| out-width: "40%" +data.frame(x = 1:10, y = 1:10) |> + ggplot(aes(x, y)) + + geom_point() + + dwfun::theme_sci(3, 2.0) +``` + +Caption of demo figure +::: + diff --git a/_extensions/drwater/dwms/_extension.yml b/_extensions/drwater/dwms/_extension.yml new file mode 100644 index 0000000..6acfb0d --- /dev/null +++ b/_extensions/drwater/dwms/_extension.yml @@ -0,0 +1,54 @@ +title: dwms-pdf-quarto +author: Ming Su +version: 0.0.1 +quarto-required: ">=1.3.0" +contributes: + formats: + common: + knitr: + opts_chunk: + echo: false + message: false + warning: false + docx: + reference-doc: _extensions/drwater/dwms/inst/MS.docx + html: + toc: true + css: _extensions/drwater/dwms/inst/drwater.css + theme: + - _extensions/drwater/dwms/inst/drwater.scss + author-location: bottom + author-links: [email, orcid, website] + include-after-body: + text: | + + pdf: + pdf-engine: xelatex + documentclass: article + toc: false + papersize: letter + fontsize: 12pt + geometry: margin=1in + fig-height: 4 # smaller fig heights make floating easier + fig-width: 7.5 # set to the (full width - margins) of letter + fig-pos: "!t" + colorlinks: true + urlcolor: blue + sansfont: "Gill Sans" + sansfontoptions: + - Color=39729E + mainfont: "Source Sans 3" #| Verdana (fontsize: 11pt) # Source Sans 3 | Times New Roman| Helvetica | PT Sans + monofont: "JetBrains Mono" + mathfont: "Cambria Math" + CJKmainfont: SimHei + block-headings: false # to deal with titlesec problems + include-in-header: header.tex + template-partials: + - "partials/title.tex" + - "partials/before-body.tex" + - "partials/after-body.tex" +filters: + - latex-environment + - authoraffil.lua +lightbox: auto +commands: [clab] diff --git a/_extensions/drwater/dwms/_quarto.yml b/_extensions/drwater/dwms/_quarto.yml new file mode 100644 index 0000000..29b5bb9 --- /dev/null +++ b/_extensions/drwater/dwms/_quarto.yml @@ -0,0 +1,121 @@ +title: "MANUSCRIPT TITLE" +submitjournal: "JOURNAL" +submitid: +lang: en +date: last-modified +# bibliography: [BB/Ref.bib, BB/localRef.bib] +affilstyle: alphabeta # number +author: + - name: Xxxxx Yyyy + affiliations: + - ref: kleac + # email: 13586740928@163.com + attributes: + corresponding: false + equal-contributor: true + role: + - data-curation: lead + - methodology: lead + - formalanalysis: lead + - writingoriginal: equal + - writingediting: eqaul + - visualisation: supporting + - name: Ming Su + email: mingsu@rcees.ac.cn + orcid: 0000-0001-9821-1268 + url: https://drwater.net/team/ming-su/ + role: + - conceptualization: lead + - methodology: supporting + - formalanalysis: lead + - writingoriginal: equal + - writingediting: equal + - visualisation: lead + - projectadmin: lead + - supervision + affiliations: + - ref: kleac + - ref: ucas + attributes: + corresponding: true + equal-contributor: true + - name: Min Yang + email: yangmin@rcees.ac.cn + affiliations: + - ref: kleac + - ref: ucas + attributes: + corresponding: true +affiliations: + - id: kleac + name: Key Laboratory of Environmental Aguatic Chemistry, State Key Laboratory of Regional Environment and Sustainability, Research Center for Eco-Environmental Sciences, Chinese Academy of Sciences + # address: No. 18 Shuangqing Road + city: Beijing + postal-code: 100085 + country: China + url: https://www.skleac.ac.cn + - id: ucas + name: University of Chinese Academy of Sciences + # address: No. 19A Yuquan Road + city: Beijing + postal-code: 100049 + country: China + url: https://www.ucas.ac.cn +crossref: + fig-title: Fig. # (default is "Figure") + tbl-title: Table # (default is "Table") + eq-title: Eq. # (default is "Equation") + title-delim: ":" # (default is ":") + fig-prefix: Fig. # (default is "Figure") + tbl-prefix: Table # (default is "Table") + eq-prefix: Eq. + ref-hyperlink: true # (default is true) + custom: + - kind: float + key: sfg + reference-prefix: "Supplementary Fig." + space-before-numbering: true + caption-prefix: "Supplementary Fig." + latex-env: sfg + latex-list-of-file-extension: lost + latex-list-of-description: Supplementary Figure + - kind: float + key: stb + reference-prefix: "Supplementary Table" + space-before-numbering: true + caption-prefix: "Supplementary Table" + latex-env: stb + latex-list-of-file-extension: lost + latex-list-of-description: Supplementary Table + - kind: float + key: seq + reference-prefix: "Supplementary Eq." + space-before-numbering: true + caption-prefix: "Supplementary Eq." + latex-env: seq + latex-list-of-file-extension: lost + latex-list-of-description: Supplementary Equation + - kind: float + key: rfg + reference-prefix: "Fig. R" + space-before-numbering: false + caption-prefix: "Fig. R" + latex-env: rfg + latex-list-of-file-extension: lost + latex-list-of-description: Revision Figure + - kind: float + key: rtb + reference-prefix: "Table R" + space-before-numbering: false + caption-prefix: "Table R" + latex-env: rtb + latex-list-of-file-extension: lost + latex-list-of-description: Revision Table + - kind: float + key: req + reference-prefix: "Eq R" + space-before-numbering: false + caption-prefix: "Eq R" + latex-env: req + latex-list-of-file-extension: lost + latex-list-of-description: Revision Equation diff --git a/_extensions/drwater/dwms/header.tex b/_extensions/drwater/dwms/header.tex new file mode 100644 index 0000000..40b8751 --- /dev/null +++ b/_extensions/drwater/dwms/header.tex @@ -0,0 +1,137 @@ +% ----------------------- +% CUSTOM PREAMBLE STUFF +% ----------------------- +\usepackage{enumitem} +\usepackage{fontspec} +\usepackage{float} +\usepackage[normalem]{ulem} +\usepackage{hyperref} +\usepackage{nameref} %needed by zref-xr +\usepackage{zref-xr,zref-hyperref,zref-user} +\usepackage{xr-hyper} +\usepackage[normalem]{ulem} +\usepackage{setspace} +\usepackage{lineno} +\usepackage[UTF8, scheme=plain]{ctex} +\usepackage{orcidlink} + +% \setkomafont{author}{\normalsize} + +% for revision +\usepackage{adjustbox} +% \usepackage{xcolor} +\usepackage{mdframed} +\newmdenv[topline=false, + leftline=true, + bottomline=false, + rightline=false, + linewidth=3pt, + %backgroundcolor=lightgray, + linecolor=gray!30, + backgroundcolor=gray!5, + skipabove=\topsep, + skipbelow=\topsep, + leftmargin=0pt, + rightmargin=0pt, + innertopmargin=0pt, + innerbottommargin=0pt + ]{refquote} +\newmdenv[topline=false, + leftline=true, + bottomline=false, + rightline=false, + linewidth=3pt, + %backgroundcolor=lightgray, + backgroundcolor=red!3!white, + linecolor=red!30!white, + skipabove=\topsep, + skipbelow=\topsep, + leftmargin=0pt, + rightmargin=0pt, + innertopmargin=10pt, + innerbottommargin=10pt + ]{question} +% setup hyperlink for page and line number +\def\msname{MS} +\def\smname{SM} +\setenumerate{labelsep=*, leftmargin=1.0pc} +%\zexternaldocument*{ManuscriptNew\veraa} +\zexternaldocument*{\msname} +\zexternaldocument*{\smname} +\newcommand{\hlabel}[1]{\label{#1}\hypertarget{#1}{ + \linelabel{line:#1}}} +%\externaldocument[si-]{\smname\veraa}[\smname\veraa.pdf] +\makeatletter +\newcommand{\clab}[2][]{ + \protected@write\@auxout{\let\clab\@secondoftwo}{ + \string\newlabel{r:#1}{{#2}{}}}% + \hlabel{#1}#2\hlabel{#1end}} +\makeatother +\newcommand{\zhypera}[1]{\href[pdfnewwindow]{\msname.pdf\##1}{\\[1ex]\textbf{Page \zpageref{#1}, Line +\zref{line:#1}--\zref{line:#1end}:}\\}} +\newcommand{\cref}[1]{\begin{refquote}\zhypera{#1}{\zref{r:#1}}\\[-0.5ex]\end{refquote}} +% \newenvironment{ra}[1][\unskip]{\par \noindent \\[-1ex] \textbf{Response/Action:}\par\bf}{\ \\} +% \renewenvironment{verbatim}{\begin{ra}}{\end{ra}} +\renewenvironment{quote}{% + \vspace{12pt plus 4pt minus 2pt}% 12pt基础间距,可伸缩 + \begin{question}% +}{% + \end{question}% + % \vspace{12pt plus 4pt minus 2pt}% +} + + + + +% ----------------- +% Title block stuff +% ----------------- + +% Title +\makeatletter +\renewcommand{\title}[1]{\gdef\@title{\large\textbf{#1}}} % Adjust \Huge or other font commands +\makeatother + + +% ------------------ +% Section headings +% ------------------ +\usepackage{titlesec} +\titleformat*{\section}{\Large\sffamily\bfseries\raggedright} +\titleformat*{\subsection}{\large\sffamily\bfseries\raggedright} +\titleformat*{\subsubsection}{\normalsize\sffamily\bfseries\raggedright} +\titleformat*{\paragraph}{\small\sffamily\bfseries\raggedright} + +%\titlespacing{}{}{}{} +% Starred version removes indentation in following paragraph +% \titlespacing*{\section}{0em}{2em}{0.1em} +% \titlespacing*{\subsection}{0em}{1.25em}{0.1em} +% \titlespacing*{\subsubsection}{0em}{0.75em}{0em} + +% ------------------ +% Headers/Footers +% ------------------ +% \usepackage{fancyhdr} +% \pagestyle{fancy} +% \fancyhf{} +% \fancyhead[L,C,R]{} +% \fancyfoot[L,C]{} +% \fancyfoot[R]{\thepage} +% \renewcommand{\headrulewidth}{1pt} +% \fancypagestyle{plain}{% +% \renewcommand{\headrulewidth}{0pt}% +% \fancyhf{}% +% \fancyfoot[R]{\thepage}% +% } +% \renewcommand\footnoterule{\rule{\linewidth}{0.1pt}\vspace{5pt}} + +% ------------------ +% Captions +% ------------------ +\usepackage[labelfont=bf,labelsep=period]{caption} +\captionsetup[figure]{font=footnotesize,justification=centering,singlelinecheck=false,format=hang} + + +% --------------------------- +% END CUSTOM PREAMBLE STUFF +% --------------------------- diff --git a/_extensions/drwater/dwms/inst/CL.docx b/_extensions/drwater/dwms/inst/CL.docx new file mode 100755 index 0000000..3727b07 Binary files /dev/null and b/_extensions/drwater/dwms/inst/CL.docx differ diff --git a/_extensions/drwater/dwms/inst/MS.docx b/_extensions/drwater/dwms/inst/MS.docx new file mode 100644 index 0000000..0165cf5 Binary files /dev/null and b/_extensions/drwater/dwms/inst/MS.docx differ diff --git a/_extensions/drwater/dwms/inst/RN.docx b/_extensions/drwater/dwms/inst/RN.docx new file mode 100755 index 0000000..a74403c Binary files /dev/null and b/_extensions/drwater/dwms/inst/RN.docx differ diff --git a/_extensions/drwater/dwms/inst/RP.docx b/_extensions/drwater/dwms/inst/RP.docx new file mode 100755 index 0000000..18580b1 Binary files /dev/null and b/_extensions/drwater/dwms/inst/RP.docx differ diff --git a/_extensions/drwater/dwms/inst/clab-tooltip.js b/_extensions/drwater/dwms/inst/clab-tooltip.js new file mode 100644 index 0000000..900b133 --- /dev/null +++ b/_extensions/drwater/dwms/inst/clab-tooltip.js @@ -0,0 +1,418 @@ +// clab-tooltip.js - 完全隔离事件版本(修改后的显示位置逻辑) +(function() { + // 全局变量存储从 RN.html 提取的内容 + let rnContentCache = {}; + let isRnContentLoaded = false; + let activeTooltip = null; + let hideTimer = null; + let isMouseOverTooltip = false; + + // 从 RN.html 提取内容(保持不变) + async function loadRnContent() { + try { + console.log('加载 RN.html...'); + const response = await fetch('RN.html'); + if (!response.ok) throw new Error(`HTTP error: ${response.status}`); + + const htmlText = await response.text(); + const parser = new DOMParser(); + const rnDoc = parser.parseFromString(htmlText, 'text/html'); + + // 查找所有包含 data-options 的元素 + const optionElements = rnDoc.querySelectorAll('[data-options]'); + console.log(`找到 ${optionElements.length} 个 data-options 元素`); + + optionElements.forEach(element => { + const optionValue = element.getAttribute('data-options'); + if (!optionValue) return; + + // 向前查找最近的 blockquote + let prevElement = element.previousElementSibling; + let blockquote = null; + + // 先找前一个兄弟元素 + while (prevElement) { + if (prevElement.tagName === 'BLOCKQUOTE') { + blockquote = prevElement; + break; + } + prevElement = prevElement.previousElementSibling; + } + + // 如果没找到,向上查找 + if (!blockquote) { + let parent = element.parentElement; + while (parent) { + let sibling = parent.previousElementSibling; + while (sibling) { + if (sibling.tagName === 'BLOCKQUOTE') { + blockquote = sibling; + break; + } + sibling = sibling.previousElementSibling; + } + if (blockquote) break; + parent = parent.parentElement; + } + } + + if (blockquote) { + const lis = blockquote.querySelectorAll('li'); + if (lis.length > 0) { + const liContents = Array.from(lis).map(li => li.textContent.trim()); + + if (!rnContentCache[optionValue]) { + rnContentCache[optionValue] = []; + } + + // 存储所有引用 + rnContentCache[optionValue].push({ + contents: liContents + }); + } + } + }); + + isRnContentLoaded = true; + + console.log('内容加载完成'); + Object.keys(rnContentCache).forEach(key => { + console.log(`"${key}": ${rnContentCache[key].length} Questions`); + }); + + } catch (error) { + console.error('加载失败:', error); + } + } + + // 创建 tooltip(保持不变) + function createTooltip() { + const tooltip = document.createElement('div'); + tooltip.className = 'clab-tooltip'; + tooltip.id = 'clab-tooltip-element'; + + // 完全阻止所有事件冒泡 + const stopAllEvents = (e) => { + e.stopPropagation(); + e.stopImmediatePropagation(); + e.preventDefault(); + return false; + }; + + // 阻止所有可能的事件 + const events = [ + 'mousedown', 'mouseup', 'click', 'dblclick', + 'mousemove', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave', + 'wheel', 'scroll', + 'touchstart', 'touchmove', 'touchend', 'touchcancel', + 'pointerdown', 'pointermove', 'pointerup', 'pointercancel', + 'dragstart', 'dragover', 'drop' + ]; + + events.forEach(eventType => { + tooltip.addEventListener(eventType, stopAllEvents, true); // 捕获阶段 + tooltip.addEventListener(eventType, stopAllEvents, false); // 冒泡阶段 + }); + + // 允许 wheel 事件用于滚动,但阻止冒泡 + tooltip.addEventListener('wheel', function(e) { + e.stopPropagation(); + e.stopImmediatePropagation(); + // 允许默认的滚动行为 + }, { passive: false }); + + // 允许鼠标在 tooltip 内移动 + tooltip.addEventListener('mousemove', function(e) { + e.stopPropagation(); + }, { passive: true }); + + document.body.appendChild(tooltip); + return tooltip; + } + + // 显示 tooltip - 已修改位置逻辑 + function showTooltip(element, tooltip) { + const rect = element.getBoundingClientRect(); + const optionValue = element.getAttribute('data-options'); + + // 清空内容 + tooltip.innerHTML = ''; + + if (rnContentCache[optionValue] && rnContentCache[optionValue].length > 0) { + const entries = rnContentCache[optionValue]; + + // 标题显示选项 + const title = document.createElement('div'); + title.className = 'tooltip-title'; + title.textContent = optionValue; + if (entries.length > 1) { + title.textContent += ` (${entries.length} questions)`; + } + tooltip.appendChild(title); + + // 显示所有引用 + entries.forEach((entry, entryIndex) => { + const content = entry.contents; + + if (content.length === 1) { + // 单一条目 + const entryDiv = document.createElement('div'); + entryDiv.className = 'entry-single'; + + if (entries.length >= 1) { + entryDiv.innerHTML = `Q${entryIndex + 1}: ${content[0]}`; + } else { + entryDiv.textContent = content[0]; + } + + tooltip.appendChild(entryDiv); + } else { + // 多个条目 + const entryDiv = document.createElement('div'); + entryDiv.className = 'entry-multiple'; + + if (entries.length > 1) { + const header = document.createElement('div'); + header.className = 'q-header'; + header.textContent = `Q${entryIndex + 1}:`; + entryDiv.appendChild(header); + } + + const ol = document.createElement('ol'); + ol.className = 'q-list'; + + content.forEach((item, itemIndex) => { + const li = document.createElement('li'); + li.innerHTML = `${entryIndex + 1}.${itemIndex + 1} ${item}`; + ol.appendChild(li); + }); + + entryDiv.appendChild(ol); + tooltip.appendChild(entryDiv); + } + }); + } else { + // 没有找到内容 + const noContent = document.createElement('div'); + noContent.className = 'tooltip-no-content'; + noContent.textContent = '未找到相关内容'; + tooltip.appendChild(noContent); + } + + // 确保 tooltip 有合适的尺寸 + tooltip.style.position = 'fixed'; + tooltip.style.zIndex = '10000'; + tooltip.style.maxWidth = '400px'; + tooltip.style.maxHeight = '500px'; + tooltip.style.overflowY = 'auto'; + tooltip.style.boxSizing = 'border-box'; + + // 首先隐藏并获取尺寸 + tooltip.style.visibility = 'hidden'; + tooltip.classList.add('active'); + document.body.appendChild(tooltip); + + const tooltipWidth = Math.min(tooltip.scrollWidth, 400); + const tooltipHeight = Math.min(tooltip.scrollHeight, 500); + + tooltip.style.width = tooltipWidth + 'px'; + tooltip.style.height = 'auto'; + + const padding = 5; + const minDistanceFromEdge = 20; + + let left, top; + let position = 'right'; // 首选右侧 + + // 检查右侧空间 + if (rect.right + padding + tooltipWidth <= window.innerWidth - minDistanceFromEdge) { + // 右侧有足够空间 + left = rect.right + padding; + top = rect.top; + position = 'right'; + } else if (rect.left - padding - tooltipWidth >= minDistanceFromEdge) { + // 左侧有足够空间 + left = rect.left - padding - tooltipWidth; + top = rect.top; + position = 'left'; + } else { + // 两侧都没有足够空间,显示在下方 + left = Math.max( + minDistanceFromEdge, + Math.min( + rect.left + (rect.width - tooltipWidth) / 2, + window.innerWidth - tooltipWidth - minDistanceFromEdge + ) + ); + top = rect.bottom + padding; + position = 'bottom'; + } + + // 垂直边界检查 - 确保不超出屏幕 + if (top + tooltipHeight > window.innerHeight - minDistanceFromEdge) { + // 如果下方空间不足,尝试显示在上方 + if (rect.top - padding - tooltipHeight >= minDistanceFromEdge) { + top = rect.top - padding - tooltipHeight; + } else { + // 上下都不够,显示在中间 + top = Math.max( + minDistanceFromEdge, + Math.min( + top, + window.innerHeight - tooltipHeight - minDistanceFromEdge + ) + ); + } + } + + // 水平边界检查 - 确保不超出屏幕 + if (position === 'right' || position === 'left') { + left = Math.max( + minDistanceFromEdge, + Math.min(left, window.innerWidth - tooltipWidth - minDistanceFromEdge) + ); + } + + tooltip.style.left = left + 'px'; + tooltip.style.top = top + 'px'; + tooltip.style.visibility = 'visible'; + + // 添加一个小箭头指示方向 + tooltip.setAttribute('data-position', position); + + activeTooltip = tooltip; + isMouseOverTooltip = true; + + // 添加 overlay 防止 body 交互 + addOverlay(); + } + + // 添加半透明 overlay(保持不变) + function addOverlay() { + // 移除现有的 overlay + removeOverlay(); + + const overlay = document.createElement('div'); + overlay.id = 'tooltip-overlay'; + overlay.style.cssText = ` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 9999; + background: transparent; + pointer-events: none; + `; + document.body.appendChild(overlay); + + // 将 overlay 的 pointer-events 设为 auto,但阻止所有事件 + overlay.addEventListener('mousedown', stopEvent, true); + overlay.addEventListener('mouseup', stopEvent, true); + overlay.addEventListener('click', stopEvent, true); + overlay.addEventListener('mousemove', stopEvent, true); + overlay.addEventListener('wheel', stopEvent, true); + + function stopEvent(e) { + e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + return false; + } + } + + // 移除 overlay(保持不变) + function removeOverlay() { + const overlay = document.getElementById('tooltip-overlay'); + if (overlay) { + overlay.remove(); + } + } + + // 隐藏 tooltip(保持不变) + function hideTooltip() { + if (!isMouseOverTooltip && activeTooltip) { + activeTooltip.classList.remove('active'); + activeTooltip = null; + removeOverlay(); + } + } + + // 强制隐藏 tooltip(保持不变) + function forceHideTooltip() { + if (activeTooltip) { + activeTooltip.classList.remove('active'); + activeTooltip = null; + isMouseOverTooltip = false; + removeOverlay(); + } + } + + // 初始化(保持不变) + document.addEventListener('DOMContentLoaded', function() { + console.log('初始化 clab-tooltip'); + + const clabElements = document.querySelectorAll('.clab[data-options]'); + console.log(`找到 ${clabElements.length} 个 .clab 元素`); + + if (clabElements.length === 0) return; + + // 加载内容 + loadRnContent(); + + // 创建 tooltip + const tooltip = createTooltip(); + + // tooltip 鼠标进入/离开 + tooltip.addEventListener('mouseenter', function() { + isMouseOverTooltip = true; + clearTimeout(hideTimer); + }); + + tooltip.addEventListener('mouseleave', function() { + isMouseOverTooltip = false; + hideTimer = setTimeout(() => { + forceHideTooltip(); + }, 100); + }); + + // 为所有 .clab 元素添加事件监听 + clabElements.forEach(clab => { + clab.addEventListener('mouseenter', function() { + clearTimeout(hideTimer); + + setTimeout(() => { + if (isRnContentLoaded) { + showTooltip(this, tooltip); + } + }, 100); + }); + + clab.addEventListener('mouseleave', function() { + hideTimer = setTimeout(() => { + hideTooltip(); + }, 100); + }); + }); + + // ESC 键隐藏 tooltip + document.addEventListener('keydown', function(e) { + if (e.key === 'Escape' && activeTooltip) { + forceHideTooltip(); + } + }); + + // 点击其他地方隐藏 tooltip + document.addEventListener('click', function(e) { + if (activeTooltip && !activeTooltip.contains(e.target)) { + forceHideTooltip(); + } + }); + + // 窗口大小改变时隐藏 tooltip + window.addEventListener('resize', forceHideTooltip); + + // 滚动时隐藏 tooltip + window.addEventListener('scroll', forceHideTooltip); + }); +})(); diff --git a/_extensions/drwater/dwms/inst/drwater.css b/_extensions/drwater/dwms/inst/drwater.css new file mode 100755 index 0000000..0c6328b --- /dev/null +++ b/_extensions/drwater/dwms/inst/drwater.css @@ -0,0 +1,395 @@ +.udot { + text-decoration-line: underline; + text-decoration-color: rgb(50, 50, 50); + text-decoration-style: dashed; + text-decoration-thickness: 1px; +} + +.good { + background-color: forestgreen; + color: lightyellow; +} + +.bad { + background-color: orangered; + color: lightyellow; +} + +.del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.5px; +} + + +.todo { + background-color: darkorange; + color: lightyellow; +} + +.com { + background-color: #0025ff; + font-weight: bold; + color: lightyellow; +} + +.add { + text-decoration-line: underline; + text-decoration-color: rgb(222 13 13); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + + +del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.0px; +} + + +ins { + text-decoration-color: rgb(222 93 93); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + + +.blockquote { + font-size: inherit; + padding-left: 1rem; + padding-right: 1.5rem; + color: black; + font-weight: 500; + margin: 0 0 1rem; + padding: .625rem 1.25rem; + border-left: .25rem solid #ffb3b3; + background-color: #ffb2b32b; +} + +/* clab-style.css */ +.clab { + display: inline !important; + position: relative !important; + cursor: pointer !important; + padding: 2px 4px !important; + margin: 0 1px !important; + border-radius: 3px !important; + font: inherit !important; + color: #000000 !important; + text-decoration: none !important; + vertical-align: baseline !important; + line-height: inherit !important; + z-index: 1 !important; +} + +/* 随机背景色(使用预定义颜色) */ +.clab:nth-child(10n+1) { background-color: #E3F2FD !important; } +.clab:nth-child(10n+2) { background-color: #F3E5F5 !important; } +.clab:nth-child(10n+3) { background-color: #E8F5E9 !important; } +.clab:nth-child(10n+4) { background-color: #FFF3E0 !important; } +.clab:nth-child(10n+5) { background-color: #FCE4EC !important; } +.clab:nth-child(10n+6) { background-color: #E0F7FA !important; } +.clab:nth-child(10n+7) { background-color: #F1F8E9 !important; } +.clab:nth-child(10n+8) { background-color: #FFF8E1 !important; } +.clab:nth-child(10n+9) { background-color: #EDE7F6 !important; } +.clab:nth-child(10n+10) { background-color: #E8EAF6 !important; } + +/* 基础hover效果 */ +span.clab:hover { + outline: 2px solid rgba(0,0,0,0.2) !important; + outline-offset: 2px !important; + z-index: 1000 !important; +} + + + + +/* clab-tooltip 下方显示样式 */ +.clab-tooltip { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + color: white; + padding: 5px; + border: 1px solid #444; + /* -webkit-user-select: none; */ + position: fixed; + background: rgba(0, 0, 0, 0.95); + border-radius: 8px; + z-index: 10000; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), + 0 0 0 1px rgba(255, 255, 255, 0.1); + font-size: 14px; + line-height: 1.1; + max-width: 500px; + max-height: 800px; + overflow-y: auto; + opacity: 0; + visibility: hidden; + transition: opacity 0.2s ease, visibility 0.2s ease, transform 0.2s ease; + overscroll-behavior: contain; + pointer-events: auto !important; +} + + +/* Tooltip 箭头 */ +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border: 6px solid transparent; + border-bottom-color: #2a2a2a; + border-top: none; +} + +/* tooltip 在上方的箭头(向下) */ +.clab-tooltip.above .tooltip-arrow { + border-top-color: #2a2a2a; + border-bottom: none; +} + +/* 标题 */ +.tooltip-title { + font-weight: 600; + color: #FF9800; + margin-bottom: 6px; + padding-bottom: 4px; + border-bottom: 1px solid #444; + font-size: 14px; + font-family: monospace; + line-height: 0.8; + pointer-events: none; +} + +/* 单一条目 */ +.entry-single { + padding: 4px 4px; + margin-bottom: 6px; + background: rgba(255, 255, 255, 0.05); + border-radius: 6px; + border-left: 3px solid #ffffff; + line-height: 1.2; + cursor: default; +} + +/* Q标签样式 */ +.q-label { + display: inline-block; + color: #FF9800; + font-weight: 600; + margin-right: 8px; + min-width: 35px; +} + +/* 多个条目的引用 */ +.entry-multiple { + padding: 4px 4px; + margin-bottom: 6px; + background: rgba(255, 255, 255, 0.05); + border-radius: 6px; + border-left: 3px solid #ffffff; + line-height: 1.2; + cursor: default; +} + +/* 多引用标题 */ +.q-header { + color: #FF9800; + font-weight: 600; + margin-bottom: 8px; + font-size: 13px; + pointer-events: none; +} + +/* 列表 */ +.q-list { + margin: 0; + padding-left: 0; + list-style: none; +} + +.q-list li { + margin-bottom: 10px; + padding-left: 0; + line-height: 1.2; + position: relative; + cursor: default; + padding: 4px 0; +} + +/* 子标签样式 */ +.q-sublabel { + display: inline-block; + color: #4CAF50; + font-weight: 600; + margin-right: 2px; + min-width: 25px; +} + +/* 条目间空行 */ +/* .entry-spacer { */ +/* height: 12px; */ +/* pointer-events: none; */ +/* } */ + +/* 无内容 */ +.tooltip-no-content { + color: #ff6b6b; + font-style: italic; + padding: 20px; + text-align: center; + background: rgba(255, 107, 107, 0.05); + border-radius: 6px; + cursor: default; +} + +/* 滚动条 */ +.clab-tooltip::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +.clab-tooltip::-webkit-scrollbar-track { + background: #1a1a1a; + border-radius: 4px; +} + +.clab-tooltip::-webkit-scrollbar-thumb { + background: #4CAF50; + border-radius: 4px; +} + +.clab-tooltip::-webkit-scrollbar-thumb:hover { + background: #45a049; +} + + +/* 允许内容文本选择 */ +.entry-single, +.entry-multiple, +.q-list li { + user-select: text; + -webkit-user-select: text; +} + +/* 鼠标在 tooltip 上时的样式 */ +.clab-tooltip:hover { + cursor: default; +} + + +.clab-tooltip.active { + opacity: 1; + visibility: visible; + transform: translateY(0); +} + +.clab-tooltip ul { + margin: 0; + padding-left: 20px; +} + +.clab-tooltip li { + margin-bottom: 8px; + position: relative; +} + +.clab-tooltip .source { + margin-top: 10px; + padding-top: 10px; + border-top: 1px solid rgba(255,255,255,0.1); + font-size: 11px; + color: #aaa; + font-style: italic; +} + +.clab-tooltip .entry { + margin-bottom: 15px; + padding-bottom: 10px; + border-bottom: 1px solid rgba(255,255,255,0.1); +} + +.clab-tooltip .entry:last-child { + border-bottom: none; +} + + + +.rem { + background-color: darkorange; + color: lightyellow; + text-decoration-thickness: 2px; +} + + +#criticnav { + position: fixed; + z-index: 1100; + top: 0; + right: 0; + width: 120px; + border-bottom: solid 1px #ffffff; + margin: 0; + padding: 10; + background-color: rgb(143 38 38 / 95%); + color: #ffffff; + font-size: 12px; + font-family: "Helvetica Neue", helvetica, arial, sans-serif !important +} + +#criticnav ul { + list-style-type: none; + width: 90%; + margin: 0 auto; + padding: 0 +} + +#criticnav ul li { + display: block; + width: 100px; + min-width: 80px; + text-align: center; + padding: 5px 0 3px !important; + margin: 5px 2px !important; + line-height: 1em; + float: center; + text-transform: uppercase; + cursor: pointer; + border-radius: 20px; + border: 3px solid rgba(255,255,255,0); + color: #fff !important +} + +p { + text-align: left; /* 小屏幕左对齐 */ +} + +@media (min-width: 768px) { + p { + text-align: justify; + hyphens: auto; /* 自动断字 */ + -webkit-hyphens: auto; /* Safari 支持 */ + /* 可选:控制断字行为 */ + hyphenate-limit-chars: 6 3 2; /* 最小单词长度 前/后最小字符数 */ + } +} + +@media (min-width: 992px) { + body .page-columns { + display: grid; + gap: 0; + grid-template-columns: [screen-start] 0.5em [screen-start-inset] 0fr [page-start page-start-inset] 5px [body-start-outset] 5px [body-start] 0.5em [body-content-start] minmax(350px, calc(855px - 0em)) [body-content-end] 0.5em [body-end] 5px [body-end-outset] minmax(75px, 550px) [page-end-inset] 1px [page-end] 1fr [screen-end-inset] 0.5em [screen-end]; + } +} + + +@media (min-width: 1280px) { + body .page-columns { + display: grid; + gap: 0; + grid-template-columns: [screen-start] 3.5em [screen-start-inset] 2fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 3.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 400px) [page-end-inset] 35px [page-end] 2fr [screen-end-inset] 1.5em [screen-end]; + } +} diff --git a/_extensions/drwater/dwms/inst/drwater.scss b/_extensions/drwater/dwms/inst/drwater.scss new file mode 100644 index 0000000..93672cf --- /dev/null +++ b/_extensions/drwater/dwms/inst/drwater.scss @@ -0,0 +1,415 @@ +/*-- scss:defaults --*/ + +$theme: "drwater" !default; + +// +// Color system +// + +$white: #ffffff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #868e96 !default; +$gray-700: #495057 !default; +$gray-800: #373a3c !default; +$gray-900: #212529 !default; +$black: #000000 !default; + +$blue: #2780e3 !default; +$indigo: #6610f2 !default; +$purple: #170c3a !default; +$pink: #a52c60 !default; +$red: #cf4446 !default; +$orange: #ee6a24 !default; +$light-orange: #fb9e07 !default; +$yellow: #f6d645 !default; +$green: #118230 !default; +$teal: #20c997 !default; +$cyan: #3093cf !default; + +$primary: $pink !default; +$secondary: $gray-700 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $orange !default; +$danger: $red !default; +$light: $gray-400 !default; +$dark: $black !default; + +// Fonts + +$font-family-sans-serif: "Libre Franklin" !default; + +$headings-font-family: "Jost" !default; +$headings-font-weight: 600 !default; + +$navbar-font-family: "Jost" !default; +$toc-font-family: "Jost" !default; +$footer-font-family: "Jost" !default; + +// Body +$body-color: $gray-900 !default; + +// Links +$link-color: $orange !default; +$link-decoration: none !default; +$link-hover-color: $red !default; +$link-hover-decoration: underline !default; + +// Inline code +$code-bg: $gray-200 !default; +$code-color: $gray-900 !default; + +// Code copy +$btn-code-copy-color-active: $orange !default; + +// TOC +$toc-color: $orange; +$toc-font-size: 1em; + +// Navbar +$navbar-bg: $purple !default; +$navbar-fg: $white !default; +$navbar-hl: $light-orange !default; + +// Footer +$footer-bg: $gray-900 !default; +$footer-fg: $gray-300 !default; + +/*-- scss:rules --*/ + +$web-font-path: "https://fonts.googleapis.com/css2?family=Jost:ital,wght@0,100..900;1,100..900&family=Libre+Franklin:ital,wght@0,100..900;1,100..900&display=swap" !default; + +@if $web-font-path { + @import url($web-font-path); +} + +body { + -webkit-font-smoothing: antialiased; +} + +/* Logo 悬停效果 */ +.navbar-brand img { + transition: all 0.3s ease; + filter: brightness(0) invert(1); + + &:hover { + filter: brightness(0) invert(0.55) sepia(1) saturate(2000%) hue-rotate(-8deg) brightness(1.05) contrast(1.2); + transform: scale(1.05); + } +} + +// ============================================= +// 桌面端样式 - 使用悬停展开下拉菜单 +// ============================================= +@media (min-width: 992px) { + /* 导航栏主菜单项样式 */ + .navbar-nav .nav-item { + position: relative; + margin: 0 0.2rem; + + .nav-link { + position: relative; + color: $navbar-fg !important; + font-weight: 500; + padding: 0.75rem 1rem !important; + border-radius: 8px; + transition: all 0.3s ease; + z-index: 1; + + /* 玻璃效果背景 */ + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba($white, 0.1); + backdrop-filter: blur(10px); + border-radius: 8px; + opacity: 0; + transition: all 0.3s ease; + z-index: -1; + border: 1px solid rgba($white, 0.2); + } + + &:hover { + color: $light-orange !important; + transform: translateY(-2px); + + &::before { + opacity: 1; + background: rgba($white, 0.15); + backdrop-filter: blur(15px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); + } + } + + /* 激活状态 */ + &.active { + color: $light-orange !important; + font-weight: 600; + + &::before { + opacity: 1; + background: rgba($light-orange, 0.2); + backdrop-filter: blur(15px); + border: 1px solid rgba($light-orange, 0.3); + } + } + } + } + + /* 有下拉菜单的主菜单项特殊样式 */ + .navbar-nav .nav-item.dropdown { + .nav-link { + padding-right: 2rem !important; + + &::after { + position: absolute; + right: 1rem; + top: 50%; + transform: translateY(-50%); + transition: all 0.3s ease; + } + } + + &:hover .nav-link::before { + opacity: 1; + background: rgba($white, 0.2); + backdrop-filter: blur(20px); + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + + &:hover .nav-link::after { + transform: translateY(-50%) rotate(-180deg); + border-top-color: $light-orange; + } + } + + /* 桌面端下拉菜单悬停效果 */ + .navbar-nav .nav-item.dropdown:hover .dropdown-menu { + display: block !important; + opacity: 1 !important; + visibility: visible !important; + transform: translateY(0) !important; + } + + .dropdown-menu { + display: block; + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: all 0.3s ease; + background: rgba($purple, 0.98) !important; + backdrop-filter: blur(20px); + border: 1px solid rgba($white, 0.1); + border-top: none; + border-radius: 0 0 8px 8px; + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2); + margin-top: -1px; + padding: 0.5rem 0; + + &.show { + display: block; + opacity: 1; + visibility: visible; + transform: translateY(0); + } + } + + .dropdown-item { + color: $white !important; + font-family: $navbar-font-family; + padding: 0.75rem 1.5rem; + transition: all 0.2s ease; + position: relative; + + /* 下拉菜单项的玻璃效果 */ + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba($white, 0.05); + border-radius: 4px; + opacity: 0; + transition: all 0.2s ease; + z-index: -1; + } + + &:hover, &:focus { + color: $light-orange !important; + transform: translateX(5px); + background: transparent !important; + + &::before { + opacity: 1; + background: rgba($white, 0.1); + } + } + } + + /* 确保下拉菜单与主菜单视觉上连接 */ + .navbar-nav .nav-item.dropdown:hover .nav-link { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } +} + +// ============================================= +// 移动端样式 - 使用点击展开下拉菜单 +// ============================================= +@media (max-width: 991.98px) { + /* 完全重置移动端导航样式,使用 Bootstrap 默认行为 */ + .navbar-collapse { + background: rgba($purple, 0.98); + backdrop-filter: blur(10px); + border-top: 1px solid rgba($white, 0.1); + margin-top: 0.5rem; + padding: 0.5rem 0; + + .navbar-nav { + .nav-item { + margin: 0; + + .nav-link { + color: $navbar-fg !important; + padding: 1rem 1.5rem !important; + border-radius: 0; + transition: all 0.2s ease; + display: flex; + justify-content: space-between; + align-items: center; + + &:hover { + color: $light-orange !important; + background: rgba($white, 0.1); + } + + &.active { + color: $light-orange !important; + background: rgba($light-orange, 0.1); + font-weight: 600; + } + } + + /* 下拉菜单项样式 */ + &.dropdown { + .dropdown-toggle::after { + transition: transform 0.3s ease; + } + + &.show { + .dropdown-toggle { + color: $light-orange !important; + background: rgba($white, 0.15); + + &::after { + transform: rotate(-180deg); + } + } + } + + .dropdown-menu { + background: rgba(darken($purple, 5%), 0.95) !important; + border: none; + border-radius: 0; + padding: 0; + margin: 0; + position: static; + float: none; + display: none; + + &.show { + display: block !important; + } + } + } + } + } + } + + /* 移动端下拉菜单项 */ + .dropdown-item { + color: $navbar-fg !important; + padding: 0.875rem 1.5rem 0.875rem 2.5rem !important; + border-radius: 0; + transition: all 0.2s ease; + + &:hover, &:focus { + color: $light-orange !important; + background: rgba($white, 0.1) !important; + transform: none; + } + + &.active { + color: $light-orange !important; + background: rgba($light-orange, 0.1) !important; + font-weight: 600; + } + } + + /* 移动端导航栏折叠按钮 */ + .navbar-toggler { + border: 1px solid rgba($white, 0.2); + padding: 0.5rem 0.75rem; + + &:focus { + box-shadow: 0 0 0 0.2rem rgba($light-orange, 0.25); + } + + .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + } + } + + /* 禁用桌面端的悬停效果 */ + .navbar-nav .nav-item .nav-link::before { + display: none; + } + + .navbar-nav .nav-item.dropdown:hover .dropdown-menu { + display: none !important; + } +} + +// ============================================= +// 通用样式 +// ============================================= + +/* 导航栏整体样式 */ +.navbar { + backdrop-filter: blur(10px); + background: rgba($purple, 0.95) !important; + border-bottom: 1px solid rgba($white, 0.1); +} + +/* 为有下拉菜单的导航项添加视觉指示 */ +.navbar-nav .nav-item.dropdown > .nav-link::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} + +/* 确保 Bootstrap 的 JavaScript 交互正常工作 */ +.navbar-nav .dropdown-toggle::after { + display: inline-block !important; +} + +/* 修复移动端点击事件 */ +.navbar-nav .nav-item.dropdown .nav-link { + cursor: pointer; +} diff --git a/_extensions/drwater/dwms/partials/after-body.tex b/_extensions/drwater/dwms/partials/after-body.tex new file mode 100644 index 0000000..e69de29 diff --git a/_extensions/drwater/dwms/partials/before-body.tex b/_extensions/drwater/dwms/partials/before-body.tex new file mode 100644 index 0000000..577d5aa --- /dev/null +++ b/_extensions/drwater/dwms/partials/before-body.tex @@ -0,0 +1,35 @@ +$-- Implements the frontmatter, title page, and abstract. + +% for some reason this does not work in header +\renewcommand{\abstractname}{Abstract.} + +% add the short title to the fancy header +$if(shorttitle)$ +\fancyhead[R]{$shorttitle$} +$endif$ +$if(shortauthors)$ +\fancyhead[L]{$shortauthors$} +$endif$ + +$if(has-frontmatter)$ +\frontmatter +$endif$ +$if(title)$ +\maketitle +%\noindent \rule{\linewidth}{.5pt} +$if(abstract)$ +\begin{abstract} +$abstract$ +\end{abstract} +$if(keywords)$ +\begin{keywords} +\def\sep{;\ } +$for(keywords/allbutlast)$$keywords$\sep $endfor$ +$for(keywords/last)$$keywords$$endfor$ +\end{keywords} +$endif$ +$endif$ +%\noindent \rule{\linewidth}{.5pt} +$endif$ + + diff --git a/_extensions/drwater/dwms/partials/title.tex b/_extensions/drwater/dwms/partials/title.tex new file mode 100644 index 0000000..4d7473d --- /dev/null +++ b/_extensions/drwater/dwms/partials/title.tex @@ -0,0 +1,58 @@ +$if(title)$ +\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} +$endif$ +$if(subtitle)$ +\usepackage{etoolbox} +\makeatletter +\providecommand{\subtitle}[1]{% add subtitle to \maketitle + \apptocmd{\@title}{\par {\large\sffamily\bfseries #1 \par}}{}{} +} +\makeatother +\subtitle{$subtitle$} +$endif$ +$-- This supports Quarto's authors normalization +\author{$for(authors)$\footnotesize $it.name.literal$$sep$ \and $endfor$} +\date{$date$} +$if(isSM)$ +\let\oldsection\section +\renewcommand{\section}{\clearpage\oldsection} +$if(newpagesubsection)$ +\let\oldsubsection\subsection +\renewcommand{\subsection}{\clearpage\oldsubsection} +$endif$ +\renewcommand{\thetable}{S\arabic{table}} +\renewcommand{\thefigure}{S\arabic{figure}} +\renewcommand{\theequation}{S\arabic{equation}} +\renewcommand{\figurename}{Figure} +\renewcommand{\tablename}{Table} +\usepackage{titlesec} +\newcommand{\sectionbreak}{\clearpage} +$endif$ +$if(isRN)$ +\renewcommand{\thetable}{R\arabic{table}} +\renewcommand{\thefigure}{R\arabic{figure}} +\renewcommand{\theequation}{R\arabic{equation}} +\renewcommand{\figurename}{Figure} +\renewcommand{\tablename}{Table} +\usepackage{titlesec} +\newcommand{\sectionbreak}{\clearpage} +$endif$ +$if(endfloat)$ +\usepackage{endfloat} +\renewcommand{\efloatseparator}{\vspace{\floatsep}} +\DeclareDelayedFloatFlavor{sidewaystable}{table} +\DeclareDelayedFloatFlavor{sidewaysfigure}{figure} +\DeclareDelayedFloatFlavor{landscape}{table} + +\let\normallongtable=\longtable +\renewcommand{\longtable}{\clearpage\normallongtable} + +\DeclareDelayedFloatFlavour*{longtable}{table} + +$endif$ +$if(linenumber)$ +\linenumbers +$endif$ +$if(doublespacing)$ +\doublespacing +$endif$ diff --git a/_extensions/drwater/dwsd/.gitignore b/_extensions/drwater/dwsd/.gitignore new file mode 100644 index 0000000..7708a1d --- /dev/null +++ b/_extensions/drwater/dwsd/.gitignore @@ -0,0 +1,3 @@ +*_files +*.html +/*.png diff --git a/_extensions/drwater/dwsd/_extension.yml b/_extensions/drwater/dwsd/_extension.yml new file mode 100644 index 0000000..bca6464 --- /dev/null +++ b/_extensions/drwater/dwsd/_extension.yml @@ -0,0 +1,21 @@ +title: revealjs format for drwater +author: Ming Su +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + formats: + revealjs: + theme: [default, _extensions/drwater/dwsd/inst/dwsd.scss] + css: _extensions/drwater/dwsd/inst/dwsd.css + slide-number: true + logo: _extensions/drwater/dwsd/inst/rceeslogo.svg + include-after-body: _extensions/drwater/dwsd/inst/autoscale.js + chalkboard: + buttons: true + preview-links: auto + toc: true + toc-depth: 1 + pointer: + key: "p" + color: "#FF0000" + pointerSize: 32 diff --git a/_extensions/drwater/dwsd/inst/autoscale.js b/_extensions/drwater/dwsd/inst/autoscale.js new file mode 100644 index 0000000..d6062c1 --- /dev/null +++ b/_extensions/drwater/dwsd/inst/autoscale.js @@ -0,0 +1,17 @@ + diff --git a/_extensions/drwater/dwsd/inst/drwater-green0.svg b/_extensions/drwater/dwsd/inst/drwater-green0.svg new file mode 100644 index 0000000..00fe227 --- /dev/null +++ b/_extensions/drwater/dwsd/inst/drwater-green0.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwsd/inst/drwater.css b/_extensions/drwater/dwsd/inst/drwater.css new file mode 100755 index 0000000..0bbdcff --- /dev/null +++ b/_extensions/drwater/dwsd/inst/drwater.css @@ -0,0 +1,109 @@ +.udot { + text-decoration-line: underline; + text-decoration-color: rgb(50, 50, 50); + text-decoration-style: dashed; + text-decoration-thickness: 1px; +} + +.good { + background-color: forestgreen; + color: lightyellow; +} + +.bad { + background-color: orangered; + color: lightyellow; +} + +.del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.5px; +} + + +.todo { + background-color: darkorange; + color: lightyellow; +} + +.com { + background-color: #0025ff; + font-weight: bold; + color: lightyellow; +} + +.add { + text-decoration-line: underline; + text-decoration-color: rgb(222 13 13); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + + +del { + text-decoration-line: line-through; + text-decoration-color: rgb(222 13 13); + text-decoration-style: initial; + text-decoration-thickness: 1.0px; +} + + +ins { + text-decoration-color: rgb(222 93 93); + background-color: violet; + text-decoration-style: initial; + text-decoration-thickness: 2px; +} + +.clab { + background-color: rgb(255, 245, 240); +} + +.rem { + background-color: darkorange; + color: lightyellow; + text-decoration-thickness: 2px; +} + + +#criticnav { + position: fixed; + z-index: 1100; + top: 0; + right: 0; + width: 120px; + border-bottom: solid 1px #ffffff; + margin: 0; + padding: 10; + background-color: rgb(143 38 38 / 95%); + color: #ffffff; + font-size: 12px; + font-family: "Helvetica Neue", helvetica, arial, sans-serif !important +} + +#criticnav ul { + list-style-type: none; + width: 90%; + margin: 0 auto; + padding: 0 +} + +#criticnav ul li { + display: block; + width: 100px; + min-width: 80px; + text-align: center; + padding: 5px 0 3px !important; + margin: 5px 2px !important; + line-height: 1em; + float: center; + text-transform: uppercase; + cursor: pointer; + border-radius: 20px; + border: 3px solid rgba(255,255,255,0); + color: #fff !important +} + diff --git a/_extensions/drwater/dwsd/inst/drwater.scss b/_extensions/drwater/dwsd/inst/drwater.scss new file mode 100644 index 0000000..93672cf --- /dev/null +++ b/_extensions/drwater/dwsd/inst/drwater.scss @@ -0,0 +1,415 @@ +/*-- scss:defaults --*/ + +$theme: "drwater" !default; + +// +// Color system +// + +$white: #ffffff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #868e96 !default; +$gray-700: #495057 !default; +$gray-800: #373a3c !default; +$gray-900: #212529 !default; +$black: #000000 !default; + +$blue: #2780e3 !default; +$indigo: #6610f2 !default; +$purple: #170c3a !default; +$pink: #a52c60 !default; +$red: #cf4446 !default; +$orange: #ee6a24 !default; +$light-orange: #fb9e07 !default; +$yellow: #f6d645 !default; +$green: #118230 !default; +$teal: #20c997 !default; +$cyan: #3093cf !default; + +$primary: $pink !default; +$secondary: $gray-700 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $orange !default; +$danger: $red !default; +$light: $gray-400 !default; +$dark: $black !default; + +// Fonts + +$font-family-sans-serif: "Libre Franklin" !default; + +$headings-font-family: "Jost" !default; +$headings-font-weight: 600 !default; + +$navbar-font-family: "Jost" !default; +$toc-font-family: "Jost" !default; +$footer-font-family: "Jost" !default; + +// Body +$body-color: $gray-900 !default; + +// Links +$link-color: $orange !default; +$link-decoration: none !default; +$link-hover-color: $red !default; +$link-hover-decoration: underline !default; + +// Inline code +$code-bg: $gray-200 !default; +$code-color: $gray-900 !default; + +// Code copy +$btn-code-copy-color-active: $orange !default; + +// TOC +$toc-color: $orange; +$toc-font-size: 1em; + +// Navbar +$navbar-bg: $purple !default; +$navbar-fg: $white !default; +$navbar-hl: $light-orange !default; + +// Footer +$footer-bg: $gray-900 !default; +$footer-fg: $gray-300 !default; + +/*-- scss:rules --*/ + +$web-font-path: "https://fonts.googleapis.com/css2?family=Jost:ital,wght@0,100..900;1,100..900&family=Libre+Franklin:ital,wght@0,100..900;1,100..900&display=swap" !default; + +@if $web-font-path { + @import url($web-font-path); +} + +body { + -webkit-font-smoothing: antialiased; +} + +/* Logo 悬停效果 */ +.navbar-brand img { + transition: all 0.3s ease; + filter: brightness(0) invert(1); + + &:hover { + filter: brightness(0) invert(0.55) sepia(1) saturate(2000%) hue-rotate(-8deg) brightness(1.05) contrast(1.2); + transform: scale(1.05); + } +} + +// ============================================= +// 桌面端样式 - 使用悬停展开下拉菜单 +// ============================================= +@media (min-width: 992px) { + /* 导航栏主菜单项样式 */ + .navbar-nav .nav-item { + position: relative; + margin: 0 0.2rem; + + .nav-link { + position: relative; + color: $navbar-fg !important; + font-weight: 500; + padding: 0.75rem 1rem !important; + border-radius: 8px; + transition: all 0.3s ease; + z-index: 1; + + /* 玻璃效果背景 */ + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba($white, 0.1); + backdrop-filter: blur(10px); + border-radius: 8px; + opacity: 0; + transition: all 0.3s ease; + z-index: -1; + border: 1px solid rgba($white, 0.2); + } + + &:hover { + color: $light-orange !important; + transform: translateY(-2px); + + &::before { + opacity: 1; + background: rgba($white, 0.15); + backdrop-filter: blur(15px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); + } + } + + /* 激活状态 */ + &.active { + color: $light-orange !important; + font-weight: 600; + + &::before { + opacity: 1; + background: rgba($light-orange, 0.2); + backdrop-filter: blur(15px); + border: 1px solid rgba($light-orange, 0.3); + } + } + } + } + + /* 有下拉菜单的主菜单项特殊样式 */ + .navbar-nav .nav-item.dropdown { + .nav-link { + padding-right: 2rem !important; + + &::after { + position: absolute; + right: 1rem; + top: 50%; + transform: translateY(-50%); + transition: all 0.3s ease; + } + } + + &:hover .nav-link::before { + opacity: 1; + background: rgba($white, 0.2); + backdrop-filter: blur(20px); + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + + &:hover .nav-link::after { + transform: translateY(-50%) rotate(-180deg); + border-top-color: $light-orange; + } + } + + /* 桌面端下拉菜单悬停效果 */ + .navbar-nav .nav-item.dropdown:hover .dropdown-menu { + display: block !important; + opacity: 1 !important; + visibility: visible !important; + transform: translateY(0) !important; + } + + .dropdown-menu { + display: block; + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: all 0.3s ease; + background: rgba($purple, 0.98) !important; + backdrop-filter: blur(20px); + border: 1px solid rgba($white, 0.1); + border-top: none; + border-radius: 0 0 8px 8px; + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2); + margin-top: -1px; + padding: 0.5rem 0; + + &.show { + display: block; + opacity: 1; + visibility: visible; + transform: translateY(0); + } + } + + .dropdown-item { + color: $white !important; + font-family: $navbar-font-family; + padding: 0.75rem 1.5rem; + transition: all 0.2s ease; + position: relative; + + /* 下拉菜单项的玻璃效果 */ + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba($white, 0.05); + border-radius: 4px; + opacity: 0; + transition: all 0.2s ease; + z-index: -1; + } + + &:hover, &:focus { + color: $light-orange !important; + transform: translateX(5px); + background: transparent !important; + + &::before { + opacity: 1; + background: rgba($white, 0.1); + } + } + } + + /* 确保下拉菜单与主菜单视觉上连接 */ + .navbar-nav .nav-item.dropdown:hover .nav-link { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } +} + +// ============================================= +// 移动端样式 - 使用点击展开下拉菜单 +// ============================================= +@media (max-width: 991.98px) { + /* 完全重置移动端导航样式,使用 Bootstrap 默认行为 */ + .navbar-collapse { + background: rgba($purple, 0.98); + backdrop-filter: blur(10px); + border-top: 1px solid rgba($white, 0.1); + margin-top: 0.5rem; + padding: 0.5rem 0; + + .navbar-nav { + .nav-item { + margin: 0; + + .nav-link { + color: $navbar-fg !important; + padding: 1rem 1.5rem !important; + border-radius: 0; + transition: all 0.2s ease; + display: flex; + justify-content: space-between; + align-items: center; + + &:hover { + color: $light-orange !important; + background: rgba($white, 0.1); + } + + &.active { + color: $light-orange !important; + background: rgba($light-orange, 0.1); + font-weight: 600; + } + } + + /* 下拉菜单项样式 */ + &.dropdown { + .dropdown-toggle::after { + transition: transform 0.3s ease; + } + + &.show { + .dropdown-toggle { + color: $light-orange !important; + background: rgba($white, 0.15); + + &::after { + transform: rotate(-180deg); + } + } + } + + .dropdown-menu { + background: rgba(darken($purple, 5%), 0.95) !important; + border: none; + border-radius: 0; + padding: 0; + margin: 0; + position: static; + float: none; + display: none; + + &.show { + display: block !important; + } + } + } + } + } + } + + /* 移动端下拉菜单项 */ + .dropdown-item { + color: $navbar-fg !important; + padding: 0.875rem 1.5rem 0.875rem 2.5rem !important; + border-radius: 0; + transition: all 0.2s ease; + + &:hover, &:focus { + color: $light-orange !important; + background: rgba($white, 0.1) !important; + transform: none; + } + + &.active { + color: $light-orange !important; + background: rgba($light-orange, 0.1) !important; + font-weight: 600; + } + } + + /* 移动端导航栏折叠按钮 */ + .navbar-toggler { + border: 1px solid rgba($white, 0.2); + padding: 0.5rem 0.75rem; + + &:focus { + box-shadow: 0 0 0 0.2rem rgba($light-orange, 0.25); + } + + .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + } + } + + /* 禁用桌面端的悬停效果 */ + .navbar-nav .nav-item .nav-link::before { + display: none; + } + + .navbar-nav .nav-item.dropdown:hover .dropdown-menu { + display: none !important; + } +} + +// ============================================= +// 通用样式 +// ============================================= + +/* 导航栏整体样式 */ +.navbar { + backdrop-filter: blur(10px); + background: rgba($purple, 0.95) !important; + border-bottom: 1px solid rgba($white, 0.1); +} + +/* 为有下拉菜单的导航项添加视觉指示 */ +.navbar-nav .nav-item.dropdown > .nav-link::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} + +/* 确保 Bootstrap 的 JavaScript 交互正常工作 */ +.navbar-nav .dropdown-toggle::after { + display: inline-block !important; +} + +/* 修复移动端点击事件 */ +.navbar-nav .nav-item.dropdown .nav-link { + cursor: pointer; +} diff --git a/_extensions/drwater/dwsd/inst/dwsd.css b/_extensions/drwater/dwsd/inst/dwsd.css new file mode 100644 index 0000000..c237b06 --- /dev/null +++ b/_extensions/drwater/dwsd/inst/dwsd.css @@ -0,0 +1,478 @@ + + +.quarto-title-author-name { + font-size: var(--r-heading3-size); + /* color: var(--r-heading-color); */ +} + +.quarto-title-affiliation { + font-size: 1.2em; + /* color: var(--r-heading-color); */ +} + +.reveal .quarto-title-block .quarto-title-authors .quarto-title-author .quarto-title-affiliation { + font-size: 1.2em; + /* color: var(--r-heading-color); */ + margin-top: 0px; + margin-bottom: 8px; +} + + +section#title-slide p.date { + font-size: 1.2em; + /* font-size: var(--r-heading3-size); */ +} + +section#title-slide h1.title { + position: relative; + padding-bottom: 30px; /* 留空间(可调整) */ +} + +/* 长细线 —— 在上 */ +section#title-slide h1.title::after { + content: ""; + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 0px; /* 粗线的高度,让两条底对齐 */ + width: 360px; + height: 1px; + background-color: var(--r-heading-color); + opacity: 0.8; +} + +/* 短粗线 —— 在下 */ +section#title-slide h1.title::before { + content: ""; + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 0; /* 底边紧贴标题的“底部参考线” */ + width: 60px; + height: 3px; + background-color: var(--r-heading-color); + opacity: 0.8; +} + + +section#title-slide p.subtitle { + font-size: var(--r-heading2-size); + /* text-decoration: underline; */ + color: var(--r-heading-color); +} + +section#title-slide a { + color: var(--r-link-color); +} + +.reveal .slide-number a { + color: #bbbbbb; + font-size: 10pt; +} + +section#title-slide a:hover { + color: var(--r-link-color-hover); +} + +.reveal[data-navigation-mode="linear"] .title-slide h1 { + font-size: var(--r-heading2-size); +} + +/* 最后的TOC不显示 */ +#TOC ul li:last-child { + display: none !important; +} + + +/* 1) 让 TOC section 成为一个居中列容器(垂直方向可调) */ +section#TOC { + display: flex; + flex-direction: column; + align-items: center; /* 水平居中子内容(h2 与 ul 的容器) */ + justify-content: flex-start;/* 若想垂直居中用 'center' */ + padding-top: 6vh; /* 页面顶部留白,可按需调整 */ + box-sizing: border-box; + height: 100%; /* 保证填满 slide 区域,方便垂直定位 */ + text-align: center; /* 默认居中(标题) */ +} + +/* 2) 标题样式 - 宽度随内容自适应并居中 */ +section#TOC h2 { + display: inline-block; /* 宽度随文本 */ + margin: 0 0 18px 0; /* 标题与下面线/正文的距离(可调) */ + position: relative; + padding-bottom: 0; /* 不要多余的内边距 */ + line-height: 1.1; +} + +section#TOC h2:after { + content: ""; + position: absolute; + top: 100%; + margin-top: 8px; + left: 50%; + transform: translateX(-50%); + width: 360px; + height: 1px; + background-color: var(--r-heading-color); + opacity: 0.8; +} + +/* 粗短线 */ +section#TOC h2:before { + content: ""; + position: absolute; + top: 100%; + margin-top: 5px; /* 调整这两个 margin 差值可控制细/粗线相对位置 */ + left: 50%; + transform: translateX(-50%); + width: 60px; + height: 3px; + background-color: var(--r-heading-color); + opacity: 0.8; +} + + + +/* 3) 将 nav 内部内容限制到中间 60% 宽度区域并水平居中 */ +section#TOC nav { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; /* 把 ul 的容器居中 */ +} + +/* 4) 列表限制为中间 60% 区域,内容左对齐 */ + +/* 默认/英文样式 */ +section#TOC ul, +section#TOC ol { + width: 50%; + max-width: 760px; + min-width: 280px; + margin: 0; + padding-left: 1.0em; + text-align: left; + list-style-position: inside; + list-style-type: decimal; /* 英文默认使用数字 */ + box-sizing: border-box; + line-height: 2.6em; +} + +/* 中文样式 */ +section#TOC[lang|="zh"] ul, +section#TOC[lang|="zh"] ol, +html[lang|="zh"] section#TOC ul, +html[lang|="zh"] section#TOC ol { + list-style-type: cjk-ideographic; + padding-left: 1.2em; /* 中文可能需要稍大缩进 */ +} + + +/* 5) 单项样式(覆盖你之前重复的规则,确保优先级) */ +section#TOC ul li, +section#TOC ol li { + font-size: var(--r-heading3-size); + color: var(--r-heading-color); + font-weight: bold; + margin: .35em 0; + word-break: break-word; +} + + +/* 链接配色 */ +section#TOC a { + color: var(--r-heading-color); + text-decoration: none; +} +section#TOC a:hover { + color: var(--r-link-color-hover); + text-decoration: underline; + /* font-size: var(--r-heading3-size); */ +} + +/* 6) 响应式微调(小屏幕时让列表宽度更宽占比) */ +@media (max-width: 900px) { + section#TOC ul, + section#TOC ol { + width: 80%; + } +} + + +.reveal .title-slide h1 { + text-align: center; + line-height: var(--r-heading-line-height); + position: relative; + display: inline-block; +} + +/* 细长线 */ +.reveal .title-slide h1:after { + content: ""; + position: absolute; + top: 100%; + margin-top: 8px; + left: 50%; + transform: translateX(-50%); + width: 360px; + height: 1px; + background-color: var(--r-heading-color); + opacity: 0.8; +} + +/* 粗短线 */ +.reveal .title-slide h1:before { + content: ""; + position: absolute; + top: 100%; + margin-top: 5px; /* 调整这两个 margin 差值可控制细/粗线相对位置 */ + left: 50%; + transform: translateX(-50%); + width: 60px; + height: 3px; + background-color: var(--r-heading-color); + opacity: 0.8; +} + + + +.reveal h2 { + text-align: left; + margin-top: 0px; + line-height: var(--r-heading-line-height); + width: auto; + position: relative; /* 关键:建立相对定位容器 */ + display: inline-block; /* 让h2宽度自适应内容 */ +} + +.reveal h2:after { + content: ""; + position: absolute; + left: 0; /* 跟随h2的左对齐 */ + top: 100%; + margin-top: 8px; + width: 360px; + height: 1px; + background-color: var(--r-heading-color); + opacity: 0.8; +} + +.reveal h2:before { + content: ""; + position: absolute; + left: 0; /* 跟随h2的左对齐 */ + top: 100%; + margin-top: 5px; + width: 60px; + height: 3px; + background-color: var(--r-heading-color); + opacity: 0.8; +} + + +.reveal ul { + list-style-type: circle; +} + +li:hover { + font-weight: bold; +} + +.reveal p:hover { + font-weight: bold; +} + +.reveal ul li { + line-height: 1.2em; +} + +.reveal .thank h2 { + font-size: var(--r-heading1-size); + line-height: var(--r-heading-line-height); +} + +.reveal .thank { + text-align: center; +} + +.reveal .thank h2:after { + content: ""; + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 0px; /* 粗线的高度,让两条底对齐 */ + width: 360px; + height: 1px; + background-color: var(--r-heading-color); + opacity: 0.8; +} + +/* 短粗线 —— 在下 */ +.reveal .thank h2:before { + content: ""; + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 0; /* 底边紧贴标题的“底部参考线” */ + width: 60px; + height: 3px; + background-color: var(--r-heading-color); + opacity: 0.8; +} + + + +.panel-tabset [role="tab"] { + border-bottom: 1px solid red; +} + +.panel-tabset [role="tab"][aria-selected="true"] { + background-color: #ffdddd; + border-bottom: 1px solid red; +} + +.white { + color: #ffffff; +} +.orange { + color: #e09a25; +} +.green { + color: #006e51; +} +.pink { + color: #d13076; +} + +.dusty { + color: #ad5d5d; +} + +.flame { + color: #ef562d; +} +.kale { + color: #5c7148; +} +.blue { + color: #0c4c8a; +} +.red { + color: #b93a32; +} +.clay { + color: #9e4624; +} +.bodacious { + color: #b76ba3; +} +.serenity { + color: #91a8d0; +} + +.cognac { + color: #60413c; +} +.sangria { + color: #760030; +} + +.alumium { + color: #75796a; +} + +.marsala { + color: #964f4c; +} +.purple { + color: #702fa8; +} + +.blank { + background-color: "Yellow"; + width: 100%; + color: red; +} + +.reveal .slide aside { + position: absolute; + margin: 0 auto; + left: 2%; + font-size: 0.7em; + text-align: end; + max-width: 90%; + width: fit-content; + color: gray; + bottom: -6%; +} + +.ref { + position: absolute; + margin: 0 auto; + right: 2%; + font-size: 1em; + text-align: end; + max-width: 90%; + width: fit-content; + color: gray; + bottom: -6%; +} + +.con { + position: absolute; + margin: 0 auto; + font-size: 1.4em; + text-align: center; + font-family: inherit; + max-width: 100%; + width: fit-content; + color: #023047; + bottom: -2%; +} + +.center { + text-align: center; +} + +.tiny { + font-size: 60%; +} + +figure > figcaption { + margin-top: -0.5em; +} + +.reveal .slide figure > figcaption, +.reveal .slide img.stretch + p.caption, +.reveal .slide img.r-stretch + p.caption { + font-size: 0.9em; + text-align: center; +} + +.reveal strong, .reveal b { + font-weight: bold; + color: crimson; +} + +.reveal pre code { + background-color: #554433; + line-height: 1.2em; + color: #fff; + /* font-size: x-large; */ +} + +.reveal pre code:hover{ + font-size: x-large; + line-height: 120%; +} + +.reveal div.sourceCode pre code { + background-color: #002233; + min-height: 100%; + /* font-size: x-large; */ +} + +.reveal div.sourceCode pre code:hover { + font-size: x-large; +} diff --git a/_extensions/drwater/dwsd/inst/dwsd.scss b/_extensions/drwater/dwsd/inst/dwsd.scss new file mode 100644 index 0000000..b649947 --- /dev/null +++ b/_extensions/drwater/dwsd/inst/dwsd.scss @@ -0,0 +1,76 @@ +/*-- scss:defaults --*/ + +/* Modified version of the metropolis theme ported into Quarto by Patrick Schwartz */ + +// fonts +@import url("https://fonts.googleapis.com/css?family=Fira+Sans:300,300i,400,400i,500,500i,700,700i"); +@import url("https://fonts.googleapis.com/css?family=Fira+Code:300,300i,400,400i,500,500i,700,700i"); +@import url("https://fonts.googleapis.com/css?family=Roboto+Mono|JetBrains+Mono&display=swap"); +@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"); + +$font-family-sans-serif: "Fira Sans", "Roboto", "Droid Serif", serif !default; +$font-family-monospace: "Fira Code", "JetBrains Mono", monospace; +$presentation-font-size-root: 32px; +$presentation-line-height: 1.5em; +$presentation-heading-font-weight: 400; + +// colors +$body-bg: #fafafa !default; +$body-color: #fff !default; +// $link-color: #EB811B !default; +$selection-bg: #26351c; + +/* #2A6465 */ + +// headings +// $presentation-heading-font: "Palatino Linotype", "Book Antiqua", Palatino, +// FreeSerif, serif !default; +// $presentation-heading-color: #383d3d !default; + +/*-- scss:rules --*/ + +:root { + --r-background-color: #fff; + --r-main-font: Source Sans Pro, simhei, microsoft yahei; + --r-main-font-size: 32px; + --r-main-color: #434343; // 正文颜色,松烟墨:#434343 乌墨:#1A1A1A + --r-block-margin: 12px; + --r-heading-margin: 0 0 12px 0; + --r-heading-font: Source Sans Pro, simhei, microsoft yahei; + --r-heading-color: #0c4c8a; //标题颜色:深青蓝色:296364;海军蓝或藏青色:0c4c8a;深青色:006D6D;钻蓝色:0F52BA;酒红:800020 + --r-heading-line-height: 1.2em; + --r-heading-letter-spacing: normal; + --r-heading-text-transform: none; + --r-heading-text-shadow: none; + --r-heading-font-weight: 900; + --r-heading1-text-shadow: none; + --r-heading1-size: 2.5em; + --r-heading2-size: 1.6em; + --r-heading3-size: 1.3em; + --r-heading4-size: 1em; + --r-code-font: SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, + Courier New, monospace; + --r-link-color: #ef562d; + --r-link-color-dark: #ef562d; + --r-link-color-hover: #d13076; + --r-selection-background-color: #98bdef; + --r-selection-color: #fff; + --quarto-hl-fu-color: #c53800; +} + +// 设置背景图片 +$background-image: url(''); +$background-position: center center; +$background-size: 40%; +$background-repeat: no-repeat; +$background-opacity: 0.04; + +// 应用到 reveal.js +.reveal .backgrounds { + background-image: $background-image; + background-position: $background-position; + background-size: $background-size; + background-repeat: $background-repeat; + opacity: $background-opacity; +} + diff --git a/_extensions/drwater/dwsd/inst/rceeslogo.pdf b/_extensions/drwater/dwsd/inst/rceeslogo.pdf new file mode 100644 index 0000000..51d1a45 Binary files /dev/null and b/_extensions/drwater/dwsd/inst/rceeslogo.pdf differ diff --git a/_extensions/drwater/dwsd/inst/rceeslogo.svg b/_extensions/drwater/dwsd/inst/rceeslogo.svg new file mode 100644 index 0000000..44431ff --- /dev/null +++ b/_extensions/drwater/dwsd/inst/rceeslogo.svg @@ -0,0 +1,5 @@ + + viewBox="0 0 621 690"> + + + diff --git a/_extensions/drwater/dwsd/inst/rceeslonglogo.pdf b/_extensions/drwater/dwsd/inst/rceeslonglogo.pdf new file mode 100644 index 0000000..50017f7 Binary files /dev/null and b/_extensions/drwater/dwsd/inst/rceeslonglogo.pdf differ diff --git a/_extensions/drwater/dwsd/inst/rceeslonglogo.svg b/_extensions/drwater/dwsd/inst/rceeslonglogo.svg new file mode 100644 index 0000000..013b69d --- /dev/null +++ b/_extensions/drwater/dwsd/inst/rceeslonglogo.svg @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_extensions/drwater/dwsd/inst/ucaslogo.png b/_extensions/drwater/dwsd/inst/ucaslogo.png new file mode 100644 index 0000000..6dabf3f Binary files /dev/null and b/_extensions/drwater/dwsd/inst/ucaslogo.png differ diff --git a/_extensions/drwater/dwsd/template.qmd b/_extensions/drwater/dwsd/template.qmd new file mode 100644 index 0000000..e96fffb --- /dev/null +++ b/_extensions/drwater/dwsd/template.qmd @@ -0,0 +1,35 @@ +--- +title: "〇、R语言实践前篇" +subtitle: 《区域水环境污染数据分析实践》
Data analysis practice of regional water environment pollution +author: 苏命、王为东
中国科学院大学资源与环境学院
中国科学院生态环境研究中心 +date: today +lang: zh +format: + dwsd-revealjs: default +--- + +```{r} +#| include: false +#| cache: false +lang <- "cn" +require(tidyverse) +knitr::opts_chunk$set(echo = TRUE) +``` + +## R语言实践部分课程简介 + +**接下来的课程由我来带着大家一起学习、实践基于R语言的数据分析。** + +### 自我介绍 + +- 苏命:来自中国科学院生态环境研究中心 +- 主要从事**水源水质水生态**方面的研究 + + + + + +## 欢迎讨论!{.center} + + +`r rmdify::slideend(wechat = FALSE, type = "public", tel = FALSE, thislink = "../")` diff --git a/_extensions/drwater/embedpdf/_extension.yml b/_extensions/drwater/embedpdf/_extension.yml new file mode 100644 index 0000000..49b990e --- /dev/null +++ b/_extensions/drwater/embedpdf/_extension.yml @@ -0,0 +1,8 @@ +title: embedpdf +author: Jeffrey Girard +version: 0.5.0 +quarto-required: ">=1.3.0" +contributes: + shortcodes: + - embedpdf.lua + diff --git a/_extensions/drwater/embedpdf/embedpdf.lua b/_extensions/drwater/embedpdf/embedpdf.lua new file mode 100644 index 0000000..178f74f --- /dev/null +++ b/_extensions/drwater/embedpdf/embedpdf.lua @@ -0,0 +1,106 @@ +-- simple HTML escaper for text nodes +local function html_escape(s) + s = tostring(s or "") + s = s:gsub("&", "&") + :gsub("<", "<") + :gsub(">", ">") + :gsub('"', """) + :gsub("'", "'") + return s +end + +function pdf(args, kwargs) + local data = pandoc.utils.stringify(args[1]) or pandoc.utils.stringify(kwargs['file']) + local width = pandoc.utils.stringify(kwargs['width']) + local height = pandoc.utils.stringify(kwargs['height']) + local border = pandoc.utils.stringify(kwargs['border']) + local class = pandoc.utils.stringify(kwargs['class']) + local button = pandoc.utils.stringify(kwargs['button']) + local image = pandoc.utils.stringify(kwargs['image']) + local image_force = pandoc.utils.stringify(kwargs['image_force']) + local image_width = pandoc.utils.stringify(kwargs['image_width']) + local image_height = pandoc.utils.stringify(kwargs['image_height']) + local image_border = pandoc.utils.stringify(kwargs['image_border']) + local image_class = pandoc.utils.stringify(kwargs['image_class']) + + if width ~= '' then + width = ' width="' .. width .. '"' + end + + if height ~= '' then + height = ' height="' .. height .. '"' + end + + if border ~= '' then + border = ' border="' .. border .. '"' + end + + if class ~= '' then + class = ' class="' .. class .. '"' + end + + if image_width ~= '' then + image_width = ' width="' .. image_width .. '"' + end + + if image_height ~= '' then + image_height = ' height="' .. image_height .. '"' + end + + if image_border ~= '' then + image_border = ' border="' .. image_border .. '"' + end + + if image_class ~= '' then + image_class = ' class="' .. image_class .. '"' + end + + local button_html = "" + if button ~= '' then + button_html = + "
" .. + html_escape(button) .. + "" + end + + if quarto.doc.isFormat("html:js") then + local html = "" + + if image_force == 'TRUE' then + -- image only, linked to pdf + html = '' .. + '' .. + '' + elseif image ~= '' then + -- pdf object with image fallback + html = '' .. + '' .. + '' .. + '' .. + '' + else + -- pdf object with text fallback + html = '' .. + 'Download PDF file.' .. + '' + end + + -- wrap main content + optional button + if button_html ~= "" then + html = "
" .. html .. button_html .. "
" + end + + return pandoc.RawInline('html', html) + else + return pandoc.Null() + end +end + + +-- Add alias shortcode +function embedpdf(...) + return pdf(...) +end diff --git a/_extensions/drwater/ignore-softbreaks/_extension.yml b/_extensions/drwater/ignore-softbreaks/_extension.yml new file mode 100644 index 0000000..f868faa --- /dev/null +++ b/_extensions/drwater/ignore-softbreaks/_extension.yml @@ -0,0 +1,7 @@ +title: Ignore Soft Breaks around Chinese Characters +author: Tom Ben +version: 1.0.0 +quarto-required: ">=1.5.0" +contributes: + filters: + - ignore-softbreaks.lua diff --git a/_extensions/drwater/ignore-softbreaks/ignore-softbreaks.lua b/_extensions/drwater/ignore-softbreaks/ignore-softbreaks.lua new file mode 100644 index 0000000..7bbd2da --- /dev/null +++ b/_extensions/drwater/ignore-softbreaks/ignore-softbreaks.lua @@ -0,0 +1,72 @@ +--- Emulate Pandoc's extension `east_asian_line_breaks` in Quarto +--- Ignore soft break adjacent to Chinese characters +--- Tracking Quarto issue: https://github.com/quarto-dev/quarto-cli/issues/8520 + +--- Copyright: © 2024–Present Tom Ben +--- License: MIT License + +function is_chinese(text) + return text:find("[\228-\233][\128-\191][\128-\191]") +end + +function is_ascii(char) + if char == nil then return false end + local ascii_code = string.byte(char) + return ascii_code >= 0 and ascii_code <= 127 +end + +function is_chinese_punctuation(char) + if char == nil then return false end + local punctuation_marks = ",。!?;:“”‘’()【】《》〈〉「」『』、" + return string.find(punctuation_marks, char, 1, true) ~= nil +end + +function is_alphanumeric(char) + if char == nil then return false end + return char:match("[%w]") ~= nil +end + +return { + { + Para = function(para) + local cs = para.content + for k, v in ipairs(cs) do + if v.t == 'SoftBreak' and cs[k - 1] and cs[k + 1] then + local p_text = cs[k - 1].text + local n_text = cs[k + 1].text + -- Ensure p_text and n_text are not nil and not empty strings + if p_text and n_text and #p_text > 0 and #n_text > 0 then + local prev_char -- Stores the last UTF-8 character of p_text + for char_item in p_text:gmatch("([\0-\x7F\xC2-\xF4][\x80-\xBF]*)") do + prev_char = char_item + end + + local next_char -- Stores the first UTF-8 character of n_text + for char_item in n_text:gmatch("([\0-\x7F\xC2-\xF4][\x80-\xBF]*)") do + next_char = char_item + break -- Found the first character + end + + -- Ensure characters were actually extracted + if prev_char and next_char then + -- Rule 1: Remove soft break between Chinese characters + if is_chinese(prev_char) and is_chinese(next_char) then + para.content[k] = pandoc.Str("") + -- Rule 2: Remove soft break after Chinese punctuation + elseif is_chinese_punctuation(prev_char) then + para.content[k] = pandoc.Str("") + -- Rule 3: Remove soft break before Chinese punctuation + elseif is_chinese_punctuation(next_char) then + para.content[k] = pandoc.Str("") + -- Rule 4: Keep soft break between Chinese chars and ASCII alphanumeric + -- This preserves spacing between Chinese and English words + -- No action needed - soft break remains + end + end + end + end + end + return para + end + } +} diff --git a/_extensions/drwater/latex-body-quotes/_extension.yml b/_extensions/drwater/latex-body-quotes/_extension.yml new file mode 100644 index 0000000..b4b9603 --- /dev/null +++ b/_extensions/drwater/latex-body-quotes/_extension.yml @@ -0,0 +1,7 @@ +title: Tailor Quotes for Chinese Characters in LaTeX Body +author: Tom Ben +version: 1.0.0 +quarto-required: ">=1.5.0" +contributes: + filters: + - latex-body-quotes.lua diff --git a/_extensions/drwater/latex-body-quotes/latex-body-quotes.lua b/_extensions/drwater/latex-body-quotes/latex-body-quotes.lua new file mode 100644 index 0000000..209a6cf --- /dev/null +++ b/_extensions/drwater/latex-body-quotes/latex-body-quotes.lua @@ -0,0 +1,25 @@ +-- Replace Chinese corner brackets with guillemets for LaTeX output. +-- This filter is responsible for body text only; header handling lives in latex-header-quotes. +-- The filter is run before citeproc to avoid touching bibliography, which is handled separately in cnbib-quotes. + +--- Copyright: © 2025–Present Tom Ben +--- License: MIT License + +function Str(el) + if not FORMAT:match('latex') then + return el + end + + local replacements = { + ['「'] = '«', + ['」'] = '»', + ['『'] = '‹', + ['』'] = '›' + } + + for original, replacement in pairs(replacements) do + el.text = el.text:gsub(original, replacement) + end + + return el +end diff --git a/_extensions/drwater/latex-environment/_extension.yml b/_extensions/drwater/latex-environment/_extension.yml new file mode 100755 index 0000000..1ff1a96 --- /dev/null +++ b/_extensions/drwater/latex-environment/_extension.yml @@ -0,0 +1,9 @@ +title: LaTeX Environment +author: RStudio, PBC +version: 1.1.0 +quarto-required: ">=1.2.198" +contributes: + filters: + - latex-environment.lua + format: + pdf: default diff --git a/_extensions/drwater/latex-environment/latex-environment.lua b/_extensions/drwater/latex-environment/latex-environment.lua new file mode 100755 index 0000000..5829013 --- /dev/null +++ b/_extensions/drwater/latex-environment/latex-environment.lua @@ -0,0 +1,133 @@ +-- environment.lua +-- Copyright (C) 2020 by RStudio, PBC + +local classEnvironments = pandoc.MetaMap({}) +local classCommands = pandoc.MetaMap({}) + +-- helper that identifies arrays +local function tisarray(t) + local i = 0 + for _ in pairs(t) do + i = i + 1 + if t[i] == nil then return false end + end + return true +end + +-- reads the environments +local function readEnvironments(meta) + local env = meta['environments'] + if env ~= nil then + if tisarray(env) then + -- read an array of strings + for i, v in ipairs(env) do + local value = pandoc.utils.stringify(v) + classEnvironments[value] = value + end + else + -- read key value pairs + for k, v in pairs(env) do + local key = pandoc.utils.stringify(k) + local value = pandoc.utils.stringify(v) + classEnvironments[key] = value + end + end + end +end + +local function readCommands(meta) + local env = meta['commands'] + if env ~= nil then + if tisarray(env) then + -- read an array of strings + for i, v in ipairs(env) do + local value = pandoc.utils.stringify(v) + classCommands[value] = value + end + else + -- read key value pairs + for k, v in pairs(env) do + local key = pandoc.utils.stringify(k) + local value = pandoc.utils.stringify(v) + classCommands[key] = value + end + end + end +end + +local function readEnvsAndCommands(meta) + readEnvironments(meta) + readCommands(meta) +end + +-- use the environments from metadata to +-- emit a custom environment for latex +local function writeEnvironments(divEl) + if quarto.doc.is_format("latex") then + for k, v in pairs(classEnvironments) do + if divEl.attr.classes:includes(k) then + -- process this into a latex environment + local beginEnv = '\\begin' .. '{' .. v .. '}' + local endEnv = '\n\\end{' .. v .. '}' + + -- check if custom options or arguments are present + -- and add them to the environment accordingly + local opts = divEl.attr.attributes['options'] + if opts then + beginEnv = beginEnv .. '[' .. opts .. ']' + end + + local args = divEl.attr.attributes['arguments'] + if args then + beginEnv = beginEnv .. '{' .. args .. '}' + end + + -- if the first and last div blocks are paragraphs then we can + -- bring the environment begin/end closer to the content + if divEl.content[1].t == "Para" and divEl.content[#divEl.content].t == "Para" then + table.insert(divEl.content[1].content, 1, pandoc.RawInline('tex', beginEnv .. "\n")) + table.insert(divEl.content[#divEl.content].content, pandoc.RawInline('tex', "\n" .. endEnv)) + else + table.insert(divEl.content, 1, pandoc.RawBlock('tex', beginEnv)) + table.insert(divEl.content, pandoc.RawBlock('tex', endEnv)) + end + return divEl + end + end + end +end + +-- use the environments from metadata to +-- emit a custom environment for latex +local function writeCommands(spanEl) + if quarto.doc.is_format("latex") then + for k, v in pairs(classCommands) do + if spanEl.attr.classes:includes(k) then + + -- resolve the begin command + local beginCommand = pandoc.RawInline('latex', '\\' .. pandoc.utils.stringify(v) .. '{') + local opts = spanEl.attr.attributes['options'] + if opts then + beginCommand = pandoc.RawInline('latex', '\\' .. pandoc.utils.stringify(v) .. '[' .. opts .. ']{') + end + + -- the end command + local endCommand = pandoc.RawInline('latex', '}') + + -- attach the raw inlines to the span contents + local result = spanEl.content + table.insert(result, 1, beginCommand) + table.insert(result, endCommand) + + return result + end + end + end +end + +-- Run in two passes so we process metadata +-- and then process the divs +return { + { Meta = readEnvsAndCommands }, + { Div = writeEnvironments, Span = writeCommands } +} diff --git a/_extensions/drwater/latex-header-quotes/_extension.yml b/_extensions/drwater/latex-header-quotes/_extension.yml new file mode 100644 index 0000000..c15975d --- /dev/null +++ b/_extensions/drwater/latex-header-quotes/_extension.yml @@ -0,0 +1,7 @@ +title: Prepare LaTeX Headers with Correct Quotes +author: Tom Ben +version: 1.0.0 +quarto-required: ">=1.5.0" +contributes: + filters: + - latex-header-quotes.lua diff --git a/_extensions/drwater/latex-header-quotes/latex-header-quotes.lua b/_extensions/drwater/latex-header-quotes/latex-header-quotes.lua new file mode 100644 index 0000000..32953ae --- /dev/null +++ b/_extensions/drwater/latex-header-quotes/latex-header-quotes.lua @@ -0,0 +1,180 @@ +-- Prepare LaTeX headers so quotation marks render correctly in the PDF body +-- while keeping proper Unicode text in PDF bookmarks. + +--- Copyright: © 2025–Present Tom Ben +--- License: MIT License + +local function format_is(name) + return FORMAT:match(name) ~= nil +end + +local function to_macro_block(inlines) + return pandoc.walk_block(pandoc.Plain(inlines), { + Quoted = function(el) + local opening, closing + if el.quotetype == "SingleQuote" then + opening = pandoc.RawInline('latex', "`") + closing = pandoc.RawInline('latex', "'") + else + opening = pandoc.RawInline('latex', "``") + closing = pandoc.RawInline('latex', "''") + end + + local result = pandoc.Inlines { opening } + for _, inline in ipairs(el.content) do + result:insert(inline) + end + result:insert(closing) + return result + end + }) +end + +local function to_unicode_block(inlines) + return pandoc.walk_block(pandoc.Plain(inlines), { + Quoted = function(el) + local opening, closing + if el.quotetype == "SingleQuote" then + opening, closing = '‘', '’' + else + opening, closing = '“', '”' + end + + local result = pandoc.Inlines { pandoc.Str(opening) } + for _, inline in ipairs(el.content) do + result:insert(inline) + end + result:insert(pandoc.Str(closing)) + return result + end, + Str = function(el) + -- Replace guillemets with curly quotes for PDF bookmarks + local text = el.text + text = text:gsub('«', '“') + text = text:gsub('»', '”') + text = text:gsub('‹', '‘') + text = text:gsub('›', '’') + if text ~= el.text then + return pandoc.Str(text) + end + return el + end + }) +end + +function Header(header) + if not format_is('latex') then + return header + end + + local attr = header.attr + local macro_block = to_macro_block(header.content) + local unicode_block = to_unicode_block(header.content) + + local latex_doc = pandoc.Pandoc({ macro_block }, pandoc.Meta {}) + local latex_body = pandoc.write(latex_doc, 'latex') + :gsub('%s+$', '') + :gsub('\n', ' ') + local bookmark_text = pandoc.utils.stringify(unicode_block) + :gsub('\n', ' ') + + attr.attributes['data-tex-body'] = latex_body + attr.attributes['data-bookmark'] = bookmark_text + + return header +end + +local latex_heading_levels = { + "section", + "subsection", + "subsubsection", + "paragraph", + "subparagraph", + "subparagraph" +} + +local function escape_tex_argument(text) + local map = { + ['\\'] = '\\\\', + ['{'] = '\\{', + ['}'] = '\\}', + ['%'] = '\\%', + ['#'] = '\\#', + ['&'] = '\\&', + ['_'] = '\\_', + ['^'] = '\\^{}', + ['~'] = '\\~{}' + } + return text:gsub('[\\%%#&_{}%^~]', map) +end + +local function heading_to_raw(header) + local tex_body = header.attr.attributes['data-tex-body'] + if not tex_body then + return nil + end + + local bookmark = header.attr.attributes['data-bookmark'] or pandoc.utils.stringify(header) + header.attr.attributes['data-tex-body'] = nil + header.attr.attributes['data-bookmark'] = nil + local short_attr = header.attr.attributes['short-title'] or header.attr.attributes['short'] + if short_attr and short_attr ~= '' then + bookmark = short_attr + end + bookmark = tostring(bookmark):gsub('\n', ' ') + local level_index = math.min(header.level, #latex_heading_levels) + local command = latex_heading_levels[level_index] + + local classes = header.attr.classes or {} + local unnumbered = false + for _, class in ipairs(classes) do + if class == 'unnumbered' then + unnumbered = true + break + end + end + + local number_attr = header.attr.attributes['number'] + if number_attr == 'no' or number_attr == 'false' or number_attr == '0' then + unnumbered = true + end + + local star = unnumbered and '*' or '' + local bookmark_escaped = escape_tex_argument(bookmark) + local texorpdfstring = '\\texorpdfstring{' .. tex_body .. '}{' .. bookmark_escaped .. '}' + local pieces = { '\\' .. command .. star .. '{' .. texorpdfstring .. '}' } + + local identifier = header.attr.identifier + if identifier and identifier ~= '' then + table.insert(pieces, '\\label{' .. identifier .. '}') + end + + if unnumbered then + table.insert(pieces, '\\addcontentsline{toc}{' .. command .. '}{' .. bookmark_escaped .. '}') + end + + return pandoc.RawBlock('latex', table.concat(pieces, '') .. '\n') +end + +function Pandoc(doc) + if not format_is('latex') then + return doc + end + + local blocks = pandoc.List:new() + for _, block in ipairs(doc.blocks) do + if block.t == 'Header' then + blocks:insert(heading_to_raw(block) or block) + else + blocks:insert(block) + end + end + + doc.blocks = blocks + return doc +end + +return { + { Header = Header }, + { Pandoc = Pandoc } +} diff --git a/_extensions/drwater/links-to-citations/_extension.yml b/_extensions/drwater/links-to-citations/_extension.yml new file mode 100644 index 0000000..2d7c073 --- /dev/null +++ b/_extensions/drwater/links-to-citations/_extension.yml @@ -0,0 +1,7 @@ +title: Links to Citations +author: Tom Ben +version: 1.0.0 +quarto-required: ">=1.5.0" +contributes: + filters: + - links-to-citations.lua diff --git a/_extensions/drwater/links-to-citations/links-to-citations.lua b/_extensions/drwater/links-to-citations/links-to-citations.lua new file mode 100644 index 0000000..d2cd3fb --- /dev/null +++ b/_extensions/drwater/links-to-citations/links-to-citations.lua @@ -0,0 +1,15 @@ +--- Remove local links but keep the link text as normal citations +--- Reference: https://stackoverflow.com/a/75559075/19418090 + +--- Copyright: © 2023 Albert Krewinkel, 2024–Present Albert Krewinkel, Tom Ben +--- License: MIT License + +function Link(link) + if not link.target:match '^https?://' then + local linkstring = pandoc.utils.stringify(link.content) + local citationmd = string.format('[%s]', linkstring) + return pandoc.utils.blocks_to_inlines( + pandoc.read(citationmd, 'markdown').blocks + ) + end +end diff --git a/_extensions/drwater/localizecnbib/_extension.yaml b/_extensions/drwater/localizecnbib/_extension.yaml new file mode 100644 index 0000000..8ab60b2 --- /dev/null +++ b/_extensions/drwater/localizecnbib/_extension.yaml @@ -0,0 +1,12 @@ +title: Localize local CN bib +authors: + - name: Tom Ben + - name: Ming Su + email: mingsu@rcees.ac.cn + orcid: 0000-0001-9821-1268 + url: https://drwater.net/team/ming-su/ +version: 0.3.2 +quarto-required: ">=1.3.0" +contributes: + filters: + - localizecnbib.lua diff --git a/_extensions/drwater/localizecnbib/_extensions/drwater/localizecnbib/_extension.yaml b/_extensions/drwater/localizecnbib/_extensions/drwater/localizecnbib/_extension.yaml new file mode 100644 index 0000000..8ab60b2 --- /dev/null +++ b/_extensions/drwater/localizecnbib/_extensions/drwater/localizecnbib/_extension.yaml @@ -0,0 +1,12 @@ +title: Localize local CN bib +authors: + - name: Tom Ben + - name: Ming Su + email: mingsu@rcees.ac.cn + orcid: 0000-0001-9821-1268 + url: https://drwater.net/team/ming-su/ +version: 0.3.2 +quarto-required: ">=1.3.0" +contributes: + filters: + - localizecnbib.lua diff --git a/_extensions/drwater/localizecnbib/_extensions/drwater/localizecnbib/localizecnbib.lua b/_extensions/drwater/localizecnbib/_extensions/drwater/localizecnbib/localizecnbib.lua new file mode 100644 index 0000000..8dbaef8 --- /dev/null +++ b/_extensions/drwater/localizecnbib/_extensions/drwater/localizecnbib/localizecnbib.lua @@ -0,0 +1,213 @@ +--- Localize Chinese bibliographies generated by Pandoc Citeproc and CSL + +--- Copyright: © 2024–Present Tom Ben +--- License: MIT License + +-- Function to check if a string contains Chinese characters +function contains_chinese(text) + return text and text:find("[\228-\233][\128-\191][\128-\191]") ~= nil +end + +-- Function to extract digits from a string +function extract_digits(text) + return text and text:match("%d+") +end + +-- Helper to find the closest previous Str (skips spaces and empty strings) +local function find_prev_str(content, start_index) + for idx = start_index - 1, 1, -1 do + local item = content[idx] + if item and item.t == "Str" and item.text ~= "" then + return item, idx + end + end + return nil, nil +end + +-- Helper to find the closest next Str (skips spaces and empty strings) +local function find_next_str(content, start_index) + for idx = start_index + 1, #content do + local item = content[idx] + if item and item.t == "Str" and item.text ~= "" then + return item, idx + end + end + return nil, nil +end + +-- Function to check if Emph contains "et al." or "et al.," +function is_et_al_emph(emph) + if emph.t ~= "Emph" or #emph.content < 3 then + return false + end + + local has_et = emph.content[1].t == "Str" and emph.content[1].text == "et" + local has_space = emph.content[2].t == "Space" + local has_al = emph.content[3].t == "Str" and + (emph.content[3].text == "al." or emph.content[3].text == "al.,") + + return has_et and has_space and has_al +end + +-- Function to process `et al.` in citations for author-date style +function process_citation(el) + local new_inlines = {} + local i = 1 + + while i <= #el.content do + local current = el.content[i] + + -- Handle italic et al. (wrapped in Emph) + if current.t == "Emph" and is_et_al_emph(current) and i > 1 then + local prev = el.content[i - 1] + if prev.t == "Str" and contains_chinese(prev.text) then + -- Replace the Emph element with plain "等" or "等," + if current.content[3].text == "al.," then + table.insert(new_inlines, pandoc.Str("等,")) + else + table.insert(new_inlines, pandoc.Str("等")) + end + i = i + 1 + else + table.insert(new_inlines, current) + i = i + 1 + end + -- Handle non-italic et al. + elseif current.t == "Str" and contains_chinese(current.text) and current.text:sub(-2) == "et" and + i + 2 <= #el.content and el.content[i + 1].t == "Space" and el.content[i + 2].t == "Str" then + local modified_text + if el.content[i + 2].text == "al." then + modified_text = current.text:sub(1, -3) .. "等" + elseif el.content[i + 2].text == "al.," then + modified_text = current.text:sub(1, -3) .. "等," + end + if modified_text then + table.insert(new_inlines, pandoc.Str(modified_text)) + i = i + 3 -- Skip the next Space and 'al.' or 'al.,' + else + table.insert(new_inlines, current) + i = i + 1 + end + else + table.insert(new_inlines, current) + i = i + 1 + end + end + + el.content = new_inlines + return el +end + +-- Function to process localizations in bibliography entries +function process_bibliography(elem) + local new_inlines = {} + local i = 1 + + -- Process both italic and non-italic `et al.` + while i <= #elem.content do + local current = elem.content[i] + + -- Handle italic et al. (wrapped in Emph) + if current.t == "Emph" and is_et_al_emph(current) and i > 2 then + local prev = elem.content[i - 2] + if prev and prev.t == "Str" and contains_chinese(prev.text) then + -- Replace with plain "等." or "等," + if current.content[3].text == "al.," then + table.insert(new_inlines, pandoc.Str("等,")) + else + table.insert(new_inlines, pandoc.Str("等.")) + end + i = i + 1 + else + table.insert(new_inlines, current) + i = i + 1 + end + -- Handle non-italic et al. + elseif i <= #elem.content - 2 and current.t == "Str" and current.text == "et" and + elem.content[i + 1].t == "Space" and i > 2 then + local prev = elem.content[i - 2] + if prev and prev.t == "Str" and contains_chinese(prev.text) then + if elem.content[i + 2].t == "Str" and elem.content[i + 2].text == "al.," then + table.insert(new_inlines, pandoc.Str("等,")) + i = i + 3 + elseif elem.content[i + 2].t == "Str" and elem.content[i + 2].text == "al." then + table.insert(new_inlines, pandoc.Str("等.")) + i = i + 3 + else + table.insert(new_inlines, current) + i = i + 1 + end + else + table.insert(new_inlines, current) + i = i + 1 + end + else + table.insert(new_inlines, current) + i = i + 1 + end + end + + elem.content = new_inlines + + -- Process other localizations + for i = 1, #elem.content do + local v = elem.content[i] + local prev_str, prev_idx = find_prev_str(elem.content, i) + local next_str, next_idx = find_next_str(elem.content, i) + + if v and v.t == "Str" then + local text = v.text:lower() + + if text == "vol." and next_str then + if prev_str and contains_chinese(prev_str.text) then + local vol_num, identifier = next_str.text:match("([^%[]+)%[(.+)%]") + if vol_num and identifier then + elem.content[i] = pandoc.Str("第" .. vol_num .. "卷[" .. identifier .. "].") + for remove_idx = next_idx, i + 1, -1 do + table.remove(elem.content, remove_idx) + end + end + end + elseif (text == "tran." or text == "trans.") and i > 2 then + if prev_str and contains_chinese(prev_str.text) and prev_str.text:match(",$") then + elem.content[i] = pandoc.Str("译.") + end + elseif (text == "ed." or text == "eds.") and i > 2 and prev_str and prev_str.t == "Str" then + if contains_chinese(prev_str.text) and prev_str.text:match(",$") then + elem.content[i] = pandoc.Str("编.") + else + local ed_num = extract_digits(prev_str.text) + local prev_prev_str = prev_idx and select(1, find_prev_str(elem.content, prev_idx)) + if ed_num and prev_prev_str and contains_chinese(prev_prev_str.text) then + elem.content[prev_idx] = pandoc.Str(ed_num .. "版.") + table.remove(elem.content, i) + if elem.content[i - 1] and elem.content[i - 1].t == "Space" then + table.remove(elem.content, i - 1) + end + end + end + end + end + end + return elem +end + +function process_div(el) + if el.classes:includes("csl-entry") then + for _, block in ipairs(el.content) do + if block.t == "Para" then + process_bibliography(block) + end + end + end + return el +end + +return { + { + Cite = process_citation, + Link = process_citation, + Div = process_div, + Span = process_bibliography + } +} diff --git a/_extensions/drwater/localizecnbib/localizecnbib.lua b/_extensions/drwater/localizecnbib/localizecnbib.lua new file mode 100644 index 0000000..8dbaef8 --- /dev/null +++ b/_extensions/drwater/localizecnbib/localizecnbib.lua @@ -0,0 +1,213 @@ +--- Localize Chinese bibliographies generated by Pandoc Citeproc and CSL + +--- Copyright: © 2024–Present Tom Ben +--- License: MIT License + +-- Function to check if a string contains Chinese characters +function contains_chinese(text) + return text and text:find("[\228-\233][\128-\191][\128-\191]") ~= nil +end + +-- Function to extract digits from a string +function extract_digits(text) + return text and text:match("%d+") +end + +-- Helper to find the closest previous Str (skips spaces and empty strings) +local function find_prev_str(content, start_index) + for idx = start_index - 1, 1, -1 do + local item = content[idx] + if item and item.t == "Str" and item.text ~= "" then + return item, idx + end + end + return nil, nil +end + +-- Helper to find the closest next Str (skips spaces and empty strings) +local function find_next_str(content, start_index) + for idx = start_index + 1, #content do + local item = content[idx] + if item and item.t == "Str" and item.text ~= "" then + return item, idx + end + end + return nil, nil +end + +-- Function to check if Emph contains "et al." or "et al.," +function is_et_al_emph(emph) + if emph.t ~= "Emph" or #emph.content < 3 then + return false + end + + local has_et = emph.content[1].t == "Str" and emph.content[1].text == "et" + local has_space = emph.content[2].t == "Space" + local has_al = emph.content[3].t == "Str" and + (emph.content[3].text == "al." or emph.content[3].text == "al.,") + + return has_et and has_space and has_al +end + +-- Function to process `et al.` in citations for author-date style +function process_citation(el) + local new_inlines = {} + local i = 1 + + while i <= #el.content do + local current = el.content[i] + + -- Handle italic et al. (wrapped in Emph) + if current.t == "Emph" and is_et_al_emph(current) and i > 1 then + local prev = el.content[i - 1] + if prev.t == "Str" and contains_chinese(prev.text) then + -- Replace the Emph element with plain "等" or "等," + if current.content[3].text == "al.," then + table.insert(new_inlines, pandoc.Str("等,")) + else + table.insert(new_inlines, pandoc.Str("等")) + end + i = i + 1 + else + table.insert(new_inlines, current) + i = i + 1 + end + -- Handle non-italic et al. + elseif current.t == "Str" and contains_chinese(current.text) and current.text:sub(-2) == "et" and + i + 2 <= #el.content and el.content[i + 1].t == "Space" and el.content[i + 2].t == "Str" then + local modified_text + if el.content[i + 2].text == "al." then + modified_text = current.text:sub(1, -3) .. "等" + elseif el.content[i + 2].text == "al.," then + modified_text = current.text:sub(1, -3) .. "等," + end + if modified_text then + table.insert(new_inlines, pandoc.Str(modified_text)) + i = i + 3 -- Skip the next Space and 'al.' or 'al.,' + else + table.insert(new_inlines, current) + i = i + 1 + end + else + table.insert(new_inlines, current) + i = i + 1 + end + end + + el.content = new_inlines + return el +end + +-- Function to process localizations in bibliography entries +function process_bibliography(elem) + local new_inlines = {} + local i = 1 + + -- Process both italic and non-italic `et al.` + while i <= #elem.content do + local current = elem.content[i] + + -- Handle italic et al. (wrapped in Emph) + if current.t == "Emph" and is_et_al_emph(current) and i > 2 then + local prev = elem.content[i - 2] + if prev and prev.t == "Str" and contains_chinese(prev.text) then + -- Replace with plain "等." or "等," + if current.content[3].text == "al.," then + table.insert(new_inlines, pandoc.Str("等,")) + else + table.insert(new_inlines, pandoc.Str("等.")) + end + i = i + 1 + else + table.insert(new_inlines, current) + i = i + 1 + end + -- Handle non-italic et al. + elseif i <= #elem.content - 2 and current.t == "Str" and current.text == "et" and + elem.content[i + 1].t == "Space" and i > 2 then + local prev = elem.content[i - 2] + if prev and prev.t == "Str" and contains_chinese(prev.text) then + if elem.content[i + 2].t == "Str" and elem.content[i + 2].text == "al.," then + table.insert(new_inlines, pandoc.Str("等,")) + i = i + 3 + elseif elem.content[i + 2].t == "Str" and elem.content[i + 2].text == "al." then + table.insert(new_inlines, pandoc.Str("等.")) + i = i + 3 + else + table.insert(new_inlines, current) + i = i + 1 + end + else + table.insert(new_inlines, current) + i = i + 1 + end + else + table.insert(new_inlines, current) + i = i + 1 + end + end + + elem.content = new_inlines + + -- Process other localizations + for i = 1, #elem.content do + local v = elem.content[i] + local prev_str, prev_idx = find_prev_str(elem.content, i) + local next_str, next_idx = find_next_str(elem.content, i) + + if v and v.t == "Str" then + local text = v.text:lower() + + if text == "vol." and next_str then + if prev_str and contains_chinese(prev_str.text) then + local vol_num, identifier = next_str.text:match("([^%[]+)%[(.+)%]") + if vol_num and identifier then + elem.content[i] = pandoc.Str("第" .. vol_num .. "卷[" .. identifier .. "].") + for remove_idx = next_idx, i + 1, -1 do + table.remove(elem.content, remove_idx) + end + end + end + elseif (text == "tran." or text == "trans.") and i > 2 then + if prev_str and contains_chinese(prev_str.text) and prev_str.text:match(",$") then + elem.content[i] = pandoc.Str("译.") + end + elseif (text == "ed." or text == "eds.") and i > 2 and prev_str and prev_str.t == "Str" then + if contains_chinese(prev_str.text) and prev_str.text:match(",$") then + elem.content[i] = pandoc.Str("编.") + else + local ed_num = extract_digits(prev_str.text) + local prev_prev_str = prev_idx and select(1, find_prev_str(elem.content, prev_idx)) + if ed_num and prev_prev_str and contains_chinese(prev_prev_str.text) then + elem.content[prev_idx] = pandoc.Str(ed_num .. "版.") + table.remove(elem.content, i) + if elem.content[i - 1] and elem.content[i - 1].t == "Space" then + table.remove(elem.content, i - 1) + end + end + end + end + end + end + return elem +end + +function process_div(el) + if el.classes:includes("csl-entry") then + for _, block in ipairs(el.content) do + if block.t == "Para" then + process_bibliography(block) + end + end + end + return el +end + +return { + { + Cite = process_citation, + Link = process_citation, + Div = process_div, + Span = process_bibliography + } +} diff --git a/_extensions/drwater/localizecnbib/template.qmd b/_extensions/drwater/localizecnbib/template.qmd new file mode 100644 index 0000000..4b3bf4a --- /dev/null +++ b/_extensions/drwater/localizecnbib/template.qmd @@ -0,0 +1,116 @@ +--- +title: "MANUSCRIPT TITLE" +subtitle: "Supplementary Information" +submitjournal: "JOURNAL" +submitid: +lang: en +date: "" +# bibliography: [BB/Ref.bib, BB/localRef.bib] +affilstyle: alphabeta # number +author: + - name: Xxxxx Yyyy + affiliations: + - ref: kleac + # email: 13586740928@163.com + attributes: + corresponding: false + equal-contributor: true + role: + - data-curation: lead + - methodology: lead + - formalanalysis: lead + - writingoriginal: equal + - writingediting: eqaul + - visualisation: supporting + - name: Ming Su + email: mingsu@rcees.ac.cn + url: https://drwater.net/team/ming-su/ + role: + - conceptualization: lead + - methodology: supporting + - formalanalysis: lead + - writingoriginal: equal + - writingediting: equal + - visualisation: lead + - projectadmin: lead + - supervision + affiliations: + - ref: kleac + - ref: ucas + attributes: + corresponding: true + equal-contributor: true + - name: Min Yang + email: yangmin@rcees.ac.cn + affiliations: + - ref: kleac + - ref: ucas + attributes: + corresponding: true +affiliations: + - id: kleac + name: State Key Laboratory of Environmental Aquatic Chemistry, Research Center for Eco-Environmental Sciences, Chinese Academy of Sciences + # address: No. 18 Shuangqing Road + city: Beijing + postal-code: 100085 + country: China + url: https://www.skleac.ac.cn + - id: ucas + name: University of Chinese Academy of Sciences + # address: No. 19A Yuquan Road + city: Beijing + postal-code: 100049 + country: China + url: https://www.ucas.ac.cn +prefer-html: true +format: + # elsevier-html: + # toc: true + # css: _extensions/drwater/dwms/inst/css/style.css + # docx: + # reference-doc: _extensions/drwater/dwms/inst/word/MS.docx + pdf: + fontsize: 12pt + keep-md: false + keep-tex: false +filters: + # - latex-environment + # - authoraffil + - localizecnbib +--- + + +```{r} +#| include: false +#| cache: false + +lang <- "en" +isRendering <- isTRUE(getOption("knitr.in.progress")) +require(tidyverse) +require(drwateR) +require(patchwork) +rmdify::rmd_init() +dwfun::init() +``` + + +{{< pagebreak >}} + +# Abstract {-} + + +{{< pagebreak >}} + + +{{< pagebreak >}} + + + +# References {-} + +::: {#refs} +::: + +{{< pagebreak >}} + + diff --git a/_extensions/drwater/no-first-paragraph/_extension.yml b/_extensions/drwater/no-first-paragraph/_extension.yml new file mode 100644 index 0000000..3217368 --- /dev/null +++ b/_extensions/drwater/no-first-paragraph/_extension.yml @@ -0,0 +1,7 @@ +title: Remove First Paragraph Style +author: Tom Ben +version: 1.0.0 +quarto-required: ">=1.5.0" +contributes: + filters: + - no-first-paragraph.lua diff --git a/_extensions/drwater/no-first-paragraph/no-first-paragraph.lua b/_extensions/drwater/no-first-paragraph/no-first-paragraph.lua new file mode 100644 index 0000000..20e12e0 --- /dev/null +++ b/_extensions/drwater/no-first-paragraph/no-first-paragraph.lua @@ -0,0 +1,16 @@ +--- Convert all paragraphs to use "Body Text" style instead of "First Paragraph" style in DOCX output +--- This is particularly useful for Chinese documents where the "First Paragraph" style is not needed + +--- Copyright: © 2025–Present Tom Ben +--- License: MIT License + +function Para(para) + -- If not DOCX output, return element unchanged + if FORMAT ~= 'docx' then + return para + end + + -- Wrap paragraph in a Div with custom-style attribute set to "Body Text" + -- This ensures all paragraphs use the "Body Text" style instead of "First Paragraph" + return pandoc.Div(para, pandoc.Attr("", {}, { ["custom-style"] = "Body Text" })) +end diff --git a/_extensions/drwater/pointer/_extension.yml b/_extensions/drwater/pointer/_extension.yml new file mode 100644 index 0000000..13b9df4 --- /dev/null +++ b/_extensions/drwater/pointer/_extension.yml @@ -0,0 +1,15 @@ +title: Pointer +author: Posit Software, PBC +version: 0.1.0 +quarto-required: ">=1.2.198" +contributes: + revealjs-plugins: + - name: RevealPointer + script: pointer.js + stylesheet: pointer.css + config: + pointer: + key: "q" + color: "red" + pointerSize: 16 + alwaysVisible: false diff --git a/_extensions/drwater/pointer/pointer.css b/_extensions/drwater/pointer/pointer.css new file mode 100644 index 0000000..bd55511 --- /dev/null +++ b/_extensions/drwater/pointer/pointer.css @@ -0,0 +1 @@ +.cursor-dot,.cursor-dot-outline{pointer-events:none;position:absolute;top:0;left:0;border-radius:50%;opacity:0;transform:translate(-50%,-50%);transition:opacity 0.3s ease-in-out,transform 0.3s ease-in-out;}.cursor-dot{width:12px;height:12px;background-color:red;z-index:99;}.no-cursor{cursor:none;}.no-cursor a,.no-cursor div,.no-cursor span{cursor:none;} diff --git a/_extensions/drwater/pointer/pointer.js b/_extensions/drwater/pointer/pointer.js new file mode 100644 index 0000000..381a857 --- /dev/null +++ b/_extensions/drwater/pointer/pointer.js @@ -0,0 +1 @@ +var RevealPointer=function(){"use strict";var e={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,pausebreak:19,capslock:20,esc:27,space:32,pageup:33,pagedown:34,end:35,home:36,leftarrow:37,uparrow:38,rightarrow:39,downarrow:40,insert:45,delete:46,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,leftwindowkey:91,rightwindowkey:92,selectkey:93,numpad0:96,numpad1:97,numpad2:98,numpad3:99,numpad4:100,numpad5:101,numpad6:102,numpad7:103,numpad8:104,numpad9:105,multiply:106,add:107,subtract:109,decimalpoint:110,divide:111,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,numlock:144,scrolllock:145,semicolon:186,equalsign:187,comma:188,dash:189,period:190,forwardslash:191,graveaccent:192,openbracket:219,backslash:220,closebracket:221,singlequote:222};return function(){var t={},o=!1,a=null,n={x:0,y:0,isVisible:!1},i={x:0,y:0,scale:1};function l(o){var a;null==(t=o.pointer||{}).key?t.key="q":t.key=t.key.toLowerCase(),null!=t.pointerSize&&"number"==typeof t.pointerSize||(t.pointerSize=12),null!=t.tailLength&&"number"==typeof t.tailLength||(t.tailLength=10),null!=t.color&&"string"==typeof t.color||(t.color="red"),null!=t.alwaysVisible&&"boolean"==typeof t.alwaysVisible||(t.alwaysVisible=!1),t.keyCode=(a=t.key,e[a])}function s(){a.style.top="".concat((n.y-i.y)/i.scale,"px"),a.style.left="".concat((n.x-i.x)/i.scale,"px"),n.isVisible?a.style.opacity="0.8":a.style.opacity="0",1!==i.scale?(a.style.width="".concat(t.pointerSize/i.scale,"px"),a.style.height="".concat(t.pointerSize/i.scale,"px")):(a.style.width="".concat(t.pointerSize,"px"),a.style.height="".concat(t.pointerSize,"px"))}function c(e){n.x=e.pageX,n.y=e.pageY;var t=document.body.style.transform;""!==t?(i.x=Number.parseInt(/translate\((.*)px,/gm.exec(t)[1]),i.y=Number.parseInt(/px,\s(.*)px\)/gm.exec(t)[1]),i.scale=Number.parseFloat(/scale\((.)\)/gm.exec(t)[1])):(i.x=0,i.y=0,i.scale=1),requestAnimationFrame(s)}function r(){(o=!o)?(document.addEventListener("mousemove",c),document.body.classList.add("no-cursor"),n.isVisible=!0):(document.removeEventListener("mousemove",c),document.body.classList.remove("no-cursor"),n.isVisible=!1,requestAnimationFrame(s))}return{id:"pointer",init:function(e){var o;l(e.getConfig()),t.alwaysVisible?r():e.addKeyBinding({keyCode:t.keyCode,key:t.key},(function(){r()})),(o=document.createElement("div")).className="cursor-dot",o.style.width="".concat(t.pointerSize,"px"),o.style.height="".concat(t.pointerSize,"px"),o.style.backgroundColor=t.color,t.alwaysVisible&&(o.style.opacity="0.8"),document.body.appendChild(o),a=o}}}}(); diff --git a/_extensions/drwater/qrcode/_extension.yml b/_extensions/drwater/qrcode/_extension.yml new file mode 100644 index 0000000..33157d8 --- /dev/null +++ b/_extensions/drwater/qrcode/_extension.yml @@ -0,0 +1,6 @@ +title: Qrcode +author: Jannik Buhr +version: 0.0.1 +contributes: + shortcodes: + - qrcode.lua diff --git a/_extensions/drwater/qrcode/assets/qrcode.js b/_extensions/drwater/qrcode/assets/qrcode.js new file mode 100644 index 0000000..5507c15 --- /dev/null +++ b/_extensions/drwater/qrcode/assets/qrcode.js @@ -0,0 +1,614 @@ +/** + * @fileoverview + * - Using the 'QRCode for Javascript library' + * - Fixed dataset of 'QRCode for Javascript library' for support full-spec. + * - this library has no dependencies. + * + * @author davidshimjs + * @see http://www.d-project.com/ + * @see http://jeromeetienne.github.com/jquery-qrcode/ + */ +var QRCode; + +(function () { + //--------------------------------------------------------------------- + // QRCode for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word "QR Code" is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; + this.parsedData = []; + + // Added to support UTF-8 Characters + for (var i = 0, l = this.data.length; i < l; i++) { + var byteArray = []; + var code = this.data.charCodeAt(i); + + if (code > 0x10000) { + byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18); + byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12); + byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[3] = 0x80 | (code & 0x3F); + } else if (code > 0x800) { + byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12); + byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[2] = 0x80 | (code & 0x3F); + } else if (code > 0x80) { + byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6); + byteArray[1] = 0x80 | (code & 0x3F); + } else { + byteArray[0] = code; + } + + this.parsedData.push(byteArray); + } + + this.parsedData = Array.prototype.concat.apply([], this.parsedData); + + if (this.parsedData.length != this.data.length) { + this.parsedData.unshift(191); + this.parsedData.unshift(187); + this.parsedData.unshift(239); + } + } + + QR8bitByte.prototype = { + getLength: function (buffer) { + return this.parsedData.length; + }, + write: function (buffer) { + for (var i = 0, l = this.parsedData.length; i < l; i++) { + buffer.put(this.parsedData[i], 8); + } + } + }; + + function QRCodeModel(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = []; + } + + QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);} + return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row=7){this.setupTypeNumber(test);} + if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);} + this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}} + return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;} + for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}} + for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}} + this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex>>bitIndex)&1)==1);} + var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;} + this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}} + row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;itotalDataCount*8){throw new Error("code length overflow. (" + +buffer.getLengthInBits() + +">" + +totalDataCount*8 + +")");} + if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);} + while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);} + while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;} + buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;} + buffer.put(QRCodeModel.PAD1,8);} + return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r=0)?modPoly.get(modIndex):0;}} + var totalCodeCount=0;for(var i=0;i=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));} + return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));} + return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;} + return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i5){lostPoint+=(3+sameCount-5);}}} + for(var row=0;row=256){n-=255;} + return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);} + if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));} + this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]]; + + function _isSupportCanvas() { + return typeof CanvasRenderingContext2D != "undefined"; + } + + // android 2.x doesn't support Data-URI spec + function _getAndroid() { + var android = false; + var sAgent = navigator.userAgent; + + if (/android/i.test(sAgent)) { // android + android = true; + var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i); + + if (aMat && aMat[1]) { + android = parseFloat(aMat[1]); + } + } + + return android; + } + + var svgDrawer = (function() { + + var Drawing = function (el, htOption) { + this._el = el; + this._htOption = htOption; + }; + + Drawing.prototype.draw = function (oQRCode) { + var _htOption = this._htOption; + var _el = this._el; + var nCount = oQRCode.getModuleCount(); + var nWidth = Math.floor(_htOption.width / nCount); + var nHeight = Math.floor(_htOption.height / nCount); + + this.clear(); + + function makeSVG(tag, attrs) { + var el = document.createElementNS('http://www.w3.org/2000/svg', tag); + for (var k in attrs) + if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]); + return el; + } + + var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight}); + svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); + _el.appendChild(svg); + + svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"})); + svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"})); + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + if (oQRCode.isDark(row, col)) { + var child = makeSVG("use", {"x": String(col), "y": String(row)}); + child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template") + svg.appendChild(child); + } + } + } + }; + Drawing.prototype.clear = function () { + while (this._el.hasChildNodes()) + this._el.removeChild(this._el.lastChild); + }; + return Drawing; + })(); + + var useSVG = document.documentElement.tagName.toLowerCase() === "svg"; + + // Drawing in DOM by using Table tag + var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () { + var Drawing = function (el, htOption) { + this._el = el; + this._htOption = htOption; + }; + + /** + * Draw the QRCode + * + * @param {QRCode} oQRCode + */ + Drawing.prototype.draw = function (oQRCode) { + var _htOption = this._htOption; + var _el = this._el; + var nCount = oQRCode.getModuleCount(); + var nWidth = Math.floor(_htOption.width / nCount); + var nHeight = Math.floor(_htOption.height / nCount); + var aHTML = ['']; + + for (var row = 0; row < nCount; row++) { + aHTML.push(''); + + for (var col = 0; col < nCount; col++) { + aHTML.push(''); + } + + aHTML.push(''); + } + + aHTML.push('
'); + _el.innerHTML = aHTML.join(''); + + // Fix the margin values as real size. + var elTable = _el.childNodes[0]; + var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2; + var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2; + + if (nLeftMarginTable > 0 && nTopMarginTable > 0) { + elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px"; + } + }; + + /** + * Clear the QRCode + */ + Drawing.prototype.clear = function () { + this._el.innerHTML = ''; + }; + + return Drawing; + })() : (function () { // Drawing in Canvas + function _onMakeImage() { + this._elImage.src = this._elCanvas.toDataURL("image/png"); + this._elImage.style.display = "block"; + this._elCanvas.style.display = "none"; + } + + // Android 2.1 bug workaround + // http://code.google.com/p/android/issues/detail?id=5141 + if (this._android && this._android <= 2.1) { + var factor = 1 / window.devicePixelRatio; + var drawImage = CanvasRenderingContext2D.prototype.drawImage; + CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) { + if (("nodeName" in image) && /img/i.test(image.nodeName)) { + for (var i = arguments.length - 1; i >= 1; i--) { + arguments[i] = arguments[i] * factor; + } + } else if (typeof dw == "undefined") { + arguments[1] *= factor; + arguments[2] *= factor; + arguments[3] *= factor; + arguments[4] *= factor; + } + + drawImage.apply(this, arguments); + }; + } + + /** + * Check whether the user's browser supports Data URI or not + * + * @private + * @param {Function} fSuccess Occurs if it supports Data URI + * @param {Function} fFail Occurs if it doesn't support Data URI + */ + function _safeSetDataURI(fSuccess, fFail) { + var self = this; + self._fFail = fFail; + self._fSuccess = fSuccess; + + // Check it just once + if (self._bSupportDataURI === null) { + var el = document.createElement("img"); + var fOnError = function() { + self._bSupportDataURI = false; + + if (self._fFail) { + self._fFail.call(self); + } + }; + var fOnSuccess = function() { + self._bSupportDataURI = true; + + if (self._fSuccess) { + self._fSuccess.call(self); + } + }; + + el.onabort = fOnError; + el.onerror = fOnError; + el.onload = fOnSuccess; + el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data. + return; + } else if (self._bSupportDataURI === true && self._fSuccess) { + self._fSuccess.call(self); + } else if (self._bSupportDataURI === false && self._fFail) { + self._fFail.call(self); + } + }; + + /** + * Drawing QRCode by using canvas + * + * @constructor + * @param {HTMLElement} el + * @param {Object} htOption QRCode Options + */ + var Drawing = function (el, htOption) { + this._bIsPainted = false; + this._android = _getAndroid(); + + this._htOption = htOption; + this._elCanvas = document.createElement("canvas"); + this._elCanvas.width = htOption.width; + this._elCanvas.height = htOption.height; + el.appendChild(this._elCanvas); + this._el = el; + this._oContext = this._elCanvas.getContext("2d"); + this._bIsPainted = false; + this._elImage = document.createElement("img"); + this._elImage.alt = "Scan me!"; + this._elImage.style.display = "none"; + this._el.appendChild(this._elImage); + this._bSupportDataURI = null; + }; + + /** + * Draw the QRCode + * + * @param {QRCode} oQRCode + */ + Drawing.prototype.draw = function (oQRCode) { + var _elImage = this._elImage; + var _oContext = this._oContext; + var _htOption = this._htOption; + + var nCount = oQRCode.getModuleCount(); + var nWidth = _htOption.width / nCount; + var nHeight = _htOption.height / nCount; + var nRoundedWidth = Math.round(nWidth); + var nRoundedHeight = Math.round(nHeight); + + _elImage.style.display = "none"; + this.clear(); + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + var bIsDark = oQRCode.isDark(row, col); + var nLeft = col * nWidth; + var nTop = row * nHeight; + _oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; + _oContext.lineWidth = 1; + _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; + _oContext.fillRect(nLeft, nTop, nWidth, nHeight); + + // 안티 앨리어싱 방지 처리 + _oContext.strokeRect( + Math.floor(nLeft) + 0.5, + Math.floor(nTop) + 0.5, + nRoundedWidth, + nRoundedHeight + ); + + _oContext.strokeRect( + Math.ceil(nLeft) - 0.5, + Math.ceil(nTop) - 0.5, + nRoundedWidth, + nRoundedHeight + ); + } + } + + this._bIsPainted = true; + }; + + /** + * Make the image from Canvas if the browser supports Data URI. + */ + Drawing.prototype.makeImage = function () { + if (this._bIsPainted) { + _safeSetDataURI.call(this, _onMakeImage); + } + }; + + /** + * Return whether the QRCode is painted or not + * + * @return {Boolean} + */ + Drawing.prototype.isPainted = function () { + return this._bIsPainted; + }; + + /** + * Clear the QRCode + */ + Drawing.prototype.clear = function () { + this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height); + this._bIsPainted = false; + }; + + /** + * @private + * @param {Number} nNumber + */ + Drawing.prototype.round = function (nNumber) { + if (!nNumber) { + return nNumber; + } + + return Math.floor(nNumber * 1000) / 1000; + }; + + return Drawing; + })(); + + /** + * Get the type by string length + * + * @private + * @param {String} sText + * @param {Number} nCorrectLevel + * @return {Number} type + */ + function _getTypeNumber(sText, nCorrectLevel) { + var nType = 1; + var length = _getUTF8Length(sText); + + for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) { + var nLimit = 0; + + switch (nCorrectLevel) { + case QRErrorCorrectLevel.L : + nLimit = QRCodeLimitLength[i][0]; + break; + case QRErrorCorrectLevel.M : + nLimit = QRCodeLimitLength[i][1]; + break; + case QRErrorCorrectLevel.Q : + nLimit = QRCodeLimitLength[i][2]; + break; + case QRErrorCorrectLevel.H : + nLimit = QRCodeLimitLength[i][3]; + break; + } + + if (length <= nLimit) { + break; + } else { + nType++; + } + } + + if (nType > QRCodeLimitLength.length) { + throw new Error("Too long data"); + } + + return nType; + } + + function _getUTF8Length(sText) { + var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a'); + return replacedText.length + (replacedText.length != sText ? 3 : 0); + } + + /** + * @class QRCode + * @constructor + * @example + * new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie"); + * + * @example + * var oQRCode = new QRCode("test", { + * text : "http://naver.com", + * width : 128, + * height : 128 + * }); + * + * oQRCode.clear(); // Clear the QRCode. + * oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode. + * + * @param {HTMLElement|String} el target element or 'id' attribute of element. + * @param {Object|String} vOption + * @param {String} vOption.text QRCode link data + * @param {Number} [vOption.width=256] + * @param {Number} [vOption.height=256] + * @param {String} [vOption.colorDark="#000000"] + * @param {String} [vOption.colorLight="#ffffff"] + * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] + */ + QRCode = function (el, vOption) { + this._htOption = { + width : 256, + height : 256, + typeNumber : 4, + colorDark : "#000000", + colorLight : "#ffffff", + correctLevel : QRErrorCorrectLevel.H + }; + + if (typeof vOption === 'string') { + vOption = { + text : vOption + }; + } + + // Overwrites options + if (vOption) { + for (var i in vOption) { + this._htOption[i] = vOption[i]; + } + } + + if (typeof el == "string") { + el = document.getElementById(el); + } + + if (this._htOption.useSVG) { + Drawing = svgDrawer; + } + + this._android = _getAndroid(); + this._el = el; + this._oQRCode = null; + this._oDrawing = new Drawing(this._el, this._htOption); + + if (this._htOption.text) { + this.makeCode(this._htOption.text); + } + }; + + /** + * Make the QRCode + * + * @param {String} sText link data + */ + QRCode.prototype.makeCode = function (sText) { + this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel); + this._oQRCode.addData(sText); + this._oQRCode.make(); + this._el.title = sText; + this._oDrawing.draw(this._oQRCode); + this.makeImage(); + }; + + /** + * Make the Image from Canvas element + * - It occurs automatically + * - Android below 3 doesn't support Data-URI spec. + * + * @private + */ + QRCode.prototype.makeImage = function () { + if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) { + this._oDrawing.makeImage(); + } + }; + + /** + * Clear the QRCode + */ + QRCode.prototype.clear = function () { + this._oDrawing.clear(); + }; + + /** + * @name QRCode.CorrectLevel + */ + QRCode.CorrectLevel = QRErrorCorrectLevel; +})(); diff --git a/_extensions/drwater/qrcode/qrcode.lua b/_extensions/drwater/qrcode/qrcode.lua new file mode 100644 index 0000000..d8c6969 --- /dev/null +++ b/_extensions/drwater/qrcode/qrcode.lua @@ -0,0 +1,107 @@ +-- for development: +local p = quarto.log.warning + +---Format string like in bash or python, +---e.g. f('Hello ${one}', {one = 'world'}) +---@param s string The string to format +---@param kwargs {[string]: string} A table with key-value replacemen pairs +---@return string +local function f(s, kwargs) + return (s:gsub('($%b{})', function(w) return kwargs[w:sub(3, -2)] or w end)) +end + + +---Merge user provided options with defaults +---@param userOptions table +---@return string JSON string to pass to molstar +local function mergeOptions(url, userOptions) + local defaultOptions = { + text = url, + width = 128, + height = 128, + colorDark = "#000000", + colorLight = "#ffffff", + } + if userOptions == nil then + return quarto.json.encode(defaultOptions) + end + + for k, v in pairs(userOptions) do + local value = pandoc.utils.stringify(v) + if value == 'true' then value = true end + if value == 'false' then value = false end + defaultOptions[k] = value + end + + return quarto.json.encode(defaultOptions) +end + + +---@return string +local function wrapInlineDiv(options) + return [[ +
+ + ]] +end + +---@return string +local function wrapInlineTex(url, opts) + return [[ +\qrcode[]] .. opts .. [[]{]] .. url .. [[} + ]] +end + +return { + ['qrcode'] = function(args, kwargs, _) + if quarto.doc.is_format("html:js") then + quarto.doc.add_html_dependency { + name = 'qrcodejs', + version = 'v1.0.0', + scripts = { './assets/qrcode.js' }, + } + local url = pandoc.utils.stringify(args[1]) + local id = "" + if args[2] ~= nil then + id = f('id="${id}" ', { id = pandoc.utils.stringify(id) }) + end + local options = mergeOptions(url, kwargs) + local text = wrapInlineDiv(options) + return pandoc.RawBlock( + 'html', + f(text, { id = id }) + ) + elseif quarto.doc.is_format("pdf") then + quarto.doc.use_latex_package("qrcode") + local url = pandoc.utils.stringify(args[1]) + local opts = "" + for k, v in pairs(kwargs) do + if string.match(k, "^pdf") then + k = string.sub(k, 4) + opts = opts .. k .. "=" .. v .. ", " + end + end + for _, v in ipairs(args) do + if string.match(v, "^pdf") then + v = string.sub(v, 4) + opts = opts .. v .. ", " + end + end + if string.len(opts) then + opts = string.sub(opts, 1, string.len(opts) - 2) + end + local text = wrapInlineTex(url, opts) + return pandoc.RawBlock( + 'tex', + text + ) + end + end, +} diff --git a/_extensions/drwater/quartocn/capitalize-subtitle.lua b/_extensions/drwater/quartocn/capitalize-subtitle.lua new file mode 100644 index 0000000..8244cdc --- /dev/null +++ b/_extensions/drwater/quartocn/capitalize-subtitle.lua @@ -0,0 +1,170 @@ +--[[ +capitalize-subtitle – Capitalize first letter after colons and em dashes in bibliography entries + +This filter capitalizes the first letter after colons and em dashes in bibliography +entries, following APA and similar styles that require subtitle capitalization. + +It only processes paragraphs within bibliography divs +Must be run after Citeproc + +Copyright: © 2025–present Tom Ben +License: MIT +]] + +local EXTRA_PUNCT = "“”‘’«»‹›„‟「」『』﹁﹂﹃﹄–—‐" +local APOSTROPHES = "'’" +local HYPHENS = "%-‐" +local AFTER_PUNCT_CLASS = "%s%p" .. EXTRA_PUNCT +local WORD_TAIL_PATTERN = "[%a" .. APOSTROPHES .. HYPHENS .. "]*" +local TRIGGER_TAIL_PATTERN = "[^%a" .. APOSTROPHES .. HYPHENS .. "]*$" + +local function is_punctuation(char) + if not char or char == "" then + return true + end + if char:match("[%s%p]") then + return true + end + return EXTRA_PUNCT:find(char, 1, true) ~= nil +end + +local INTERNAL_MARKS = { + { + mark = ":", + skip = function(punct) + return punct == "" or punct:find("/") + end, + }, + { mark = "—" }, +} + +local function capitalize_internal_marks(text) + for _, config in ipairs(INTERNAL_MARKS) do + local pattern = config.mark .. "([" .. AFTER_PUNCT_CLASS .. "]*)([a-z])" + text = text:gsub(pattern, function(punct, letter) + -- Require some separation after colon (e.g., space or quote) to avoid URLs and protocols + if config.skip and config.skip(punct) then + return config.mark .. punct .. letter + end + return config.mark .. punct .. letter:upper() + end) + end + + return text +end + +--- Capitalize first letter if it's lowercase. +--- Returns transformed string and a boolean indicating whether capitalization occurred. +local function capitalize_first(str) + if not str or str == "" then + return str, false + end + -- Separate leading punctuation/spaces (including common typographic quotes) from the word + local leading, remainder = str:match("^([%s%p" .. EXTRA_PUNCT .. "]*)(.*)") + if not remainder or remainder == "" then + return str, false + end + local already_capitalized = remainder:match("^([A-Z]" .. WORD_TAIL_PATTERN .. ")") + if already_capitalized then + return str, true + end + local word, suffix = remainder:match("^([a-z]" .. WORD_TAIL_PATTERN .. ")(.*)") + if not word then + local first_char = remainder:sub(1, 1) + if not is_punctuation(first_char) then + return str, true + end + return str, false + end + -- Only capitalize when the word is purely alphabetic (with optional hyphen/apostrophe) + -- and is followed by punctuation/space or nothing. This avoids changing items like e2105061118. + local next_char = suffix:sub(1, 1) + if suffix ~= "" and not is_punctuation(next_char) then + return str, false + end + return leading .. word:sub(1, 1):upper() .. word:sub(2) .. suffix, true +end + +local process_inlines --- forward declaration for mutual recursion + +local SIMPLE_WRAPPERS = { + Emph = pandoc.Emph, + Strong = pandoc.Strong, + SmallCaps = pandoc.SmallCaps, +} + +local function rebuild_container(elem, capitalize_next) + if not elem.content then + return nil, capitalize_next + end + + local processed + processed, capitalize_next = process_inlines(elem.content, capitalize_next) + + local wrap = SIMPLE_WRAPPERS[elem.t] + if wrap then + return wrap(processed), capitalize_next + elseif elem.t == "Span" then + return pandoc.Span(processed, elem.attr), capitalize_next + elseif elem.t == "Quoted" then + return pandoc.Quoted(elem.quotetype, processed), capitalize_next + end + + return nil, capitalize_next +end + +--- Process a list of inlines recursively: capitalize word after colon or em dash. +-- Returns processed inline list and updated capitalize_next flag. +function process_inlines(inlines_list, capitalize_next) + local result = {} + capitalize_next = capitalize_next or false + + for _, elem in ipairs(inlines_list) do + if elem.t == "Str" then + local text = elem.text + + text = capitalize_internal_marks(text) + + if capitalize_next then + local new_text, consumed = capitalize_first(text) + text = new_text + capitalize_next = not consumed + end + + if text:find(":" .. TRIGGER_TAIL_PATTERN) or text:find("—" .. TRIGGER_TAIL_PATTERN) then + capitalize_next = true + end + + result[#result + 1] = pandoc.Str(text) + elseif elem.t == "Space" or elem.t == "SoftBreak" or elem.t == "LineBreak" then + result[#result + 1] = elem + else + local rebuilt + rebuilt, capitalize_next = rebuild_container(elem, capitalize_next) + if rebuilt then + result[#result + 1] = rebuilt + else + result[#result + 1] = elem + capitalize_next = false + end + end + end + + return result, capitalize_next +end + +--- Process paragraphs: capitalize word after colon or em dash +local function process_para(para) + local processed_content = process_inlines(para.content, false) + return pandoc.Para(processed_content) +end + +--- Only process divs with bibliography classes +function Div(div) + -- Check for bibliography-related classes + if div.classes:includes("references") or + div.classes:includes("csl-bib-body") or + div.classes:includes("csl-entry") then + return pandoc.walk_block(div, { Para = process_para }) + end +end diff --git a/_extensions/drwater/quartocn/citation-backlinks.lua b/_extensions/drwater/quartocn/citation-backlinks.lua new file mode 100644 index 0000000..233c2c6 --- /dev/null +++ b/_extensions/drwater/quartocn/citation-backlinks.lua @@ -0,0 +1,91 @@ +--- Modified from https://github.com/bcdavasconcelos/citetools/blob/main/_extensions/citetools/citation-backlinks.lua + +--- Todo: even with link-citations and link-fields turned off, citation-backlinks still adds a single backlink to each reference in the final bibliography div. + +--- citation-backlinks.lua – adds citation backlinks to the bibliography +-- https://github.com/tarleb/citation-backlinks +--- Copyright: © 2022–2024 John MacFarlane and Albert Krewinkel and Bernardo Vasconcelos +--- License: MIT – see LICENSE for details + +-- Makes sure users know if their pandoc version is too old for this +-- filter. +PANDOC_VERSION:must_be_at_least '2.17' + +-- cites is a table mapping citation item identifiers +-- to an array of cite identifiers +local cites = {} + +-- counter for cite identifiers +local cite_number = 1 + +local function with_label(s, el) + if FORMAT == "latex" then + return { pandoc.RawInline("latex", "\\label{" .. s .. "}"), el } + end + if FORMAT == "typst" then + return { el, pandoc.RawInline("typst", " #label(\"" .. s .. "\")") } + end + if FORMAT == "docx" or FORMAT == "html" then + return { el } + end +end + +function Cite(el) + local cite_id = "cite_" .. cite_number + cite_number = cite_number + 1 + for _, citation in ipairs(el.citations) do + -- Only process the citation if they are cited in the text, excluding 'nocite'!! + if citation.mode == 'NormalCitation' then + if cites[citation.id] then + table.insert(cites[citation.id], cite_id) + else + cites[citation.id] = { cite_id } + end + end + end + if FORMAT == "typst" then + return pandoc.Span(with_label(cite_id, el)) + else + return pandoc.Span(with_label(cite_id, el), pandoc.Attr(cite_id)) + end +end + +function append_inline(blocks, inlines) + local last = blocks[#blocks] + if last.t == 'Para' or last.t == 'Plain' then + -- append to last block + last.content:extend(inlines) + else + -- append as additional block + blocks[#blocks + 1] = pandoc.Plain(inlines) + end + return blocks +end + +function Div(el) + local citation_id = el.identifier:match("ref%-(.+)") + local tex_return_link = pandoc.RawInline("latex", "\\Acrobatmenu{GoBack}{$\\hookleftarrow$}") + + if citation_id then + local backlinks = pandoc.Inlines { pandoc.Space(), pandoc.Str("[") } + if FORMAT == "latex" then + table.insert(backlinks, tex_return_link) + end + + for i, cite_id in ipairs(cites[citation_id] or {}) do + local marker = pandoc.Str(i) + if FORMAT == "latex" then + marker = pandoc.RawInline("latex", "\\pageref{" .. cite_id .. "}") + end + if #backlinks > 2 then + table.insert(backlinks, pandoc.Str(",")) + table.insert(backlinks, pandoc.Space()) + end + table.insert(backlinks, pandoc.Link(marker, "#" .. cite_id)) + end + if #backlinks > 2 then + append_inline(el.content, backlinks .. { pandoc.Str("]") }) + end + return el + end +end diff --git a/_extensions/drwater/quartocn/citation-tools.py b/_extensions/drwater/quartocn/citation-tools.py new file mode 100644 index 0000000..ba969e0 --- /dev/null +++ b/_extensions/drwater/quartocn/citation-tools.py @@ -0,0 +1,254 @@ +""" +Citation Tools for Academic Writing + +This script provides utilities for managing citations in academic writing: +1. Extract citation keys from Markdown files and create a filtered bibliography +2. Copy cited reference files to a specified directory for backup or sharing + +Typical usage: + python citation-tools.py --extract + python citation-tools.py --copy + +Copyright: © 2025–Present Tom Ben +License: MIT License +""" + +import os +import re +import shutil +import argparse +import json +from pathlib import Path + + +def extract_citation_keys(markdown_file): + """Extract citation keys from a markdown file.""" + with open(markdown_file, 'r', encoding='utf-8') as f: + content = f.read() + + # Pattern 1: [@key] or [@key1; @key2] format + pattern1 = r'\[@([a-zA-Z0-9\-]+)(?:[\s\]\;\,]|$)' + + # Pattern 2: standalone @key format + pattern2 = r'(?}}' with '{{<...>}}' + content = re.sub(r"\{\{\\<(.*)\\>}}", r"{{<\1>}}", content) + # Remove comment blocks to avoid errors of Python filter + content = re.sub(r"^```{=comment}.*?^```$", "", + content, flags=re.DOTALL | re.MULTILINE) + + # Randomize footnote identifiers + content = randomize_footnote_identifiers(content) + # Convert reference-style links to inline links + content = convert_reference_to_inline(content) + # Remove line breaks in quotes + content = remove_linebreaks_in_quotes(content) + # Reformat math equations + content = reformat_math_equations(content) + + with open(output_file, "w", encoding="utf-8") as f: + f.write(content) + + +def main(): + md_files = get_md_files() + + # Create contents_tmp directory if it doesn't exist + tmp_dir = "contents_tmp" + if not os.path.exists(tmp_dir): + os.makedirs(tmp_dir) + + # Convert *.md files to *.qmd files in contents_tmp directory + qmd_files = [os.path.join(tmp_dir, os.path.basename( + f).replace(".md", ".qmd")) for f in md_files] + + for md_file, qmd_file in zip(md_files, qmd_files): + process_file(md_file, qmd_file) + + # Process existing .qmd files in contents directory and output to contents_tmp + os.chdir('contents') + existing_qmd_files = glob.glob('*.qmd') + + for qmd_file in existing_qmd_files: + output_file = os.path.join('..', tmp_dir, qmd_file) + process_file(qmd_file, output_file) + + +if __name__ == "__main__": + main() diff --git a/_extensions/drwater/quartocn/get-bib.lua b/_extensions/drwater/quartocn/get-bib.lua new file mode 100644 index 0000000..d05d377 --- /dev/null +++ b/_extensions/drwater/quartocn/get-bib.lua @@ -0,0 +1,17 @@ +--- Get a BibTeX/BibLaTeX or CSL JSON file cited from a large database +--- Source: https://pandoc.org/lua-filters.html#pandoc.utils.references +--- https://fosstodon.org/@pandoc/109549882954402931 + +--- Copyright: © 2022–Present Albert Krewinkel +--- License: MIT License + +-- *Note*: For BibLaTeX, it is needed to change the following entry name: +-- - journal -> journaltitle +-- - address -> location +-- - publisher -> institution (only for thesis) + +function Pandoc(doc) + doc.meta.references = pandoc.utils.references(doc) + doc.meta.bibliography = nil + return doc +end diff --git a/_extensions/drwater/quartocn/remove-doi-hyperlinks.lua b/_extensions/drwater/quartocn/remove-doi-hyperlinks.lua new file mode 100644 index 0000000..e17cc29 --- /dev/null +++ b/_extensions/drwater/quartocn/remove-doi-hyperlinks.lua @@ -0,0 +1,14 @@ +--- Remove hyperlinks from DOIs while preserving the DOI text +--- Useful for styles without DOIs but you don't want to edit the bibliography file + +--- Copyright: © 2024–Present Tom Ben +--- License: MIT License + +function Link(el) + -- Check if this is a DOI link + if el.target:match("^https?://doi%.org") then + -- Return just the link text content without the link wrapper + return el.content + end + return el +end diff --git a/_extensions/drwater/quotescnbib/_extension.yaml b/_extensions/drwater/quotescnbib/_extension.yaml new file mode 100644 index 0000000..b734f5d --- /dev/null +++ b/_extensions/drwater/quotescnbib/_extension.yaml @@ -0,0 +1,12 @@ +title: Localize local CN bib +authors: + - name: Tom Ben + - name: Ming Su + email: mingsu@rcees.ac.cn + orcid: 0000-0001-9821-1268 + url: https://drwater.net/team/ming-su/ +version: 0.3.2 +quarto-required: ">=1.3.0" +contributes: + filters: + - quotescnbib.lua diff --git a/_extensions/drwater/quotescnbib/_extensions/drwater/localizecnbib/_extension.yaml b/_extensions/drwater/quotescnbib/_extensions/drwater/localizecnbib/_extension.yaml new file mode 100644 index 0000000..b734f5d --- /dev/null +++ b/_extensions/drwater/quotescnbib/_extensions/drwater/localizecnbib/_extension.yaml @@ -0,0 +1,12 @@ +title: Localize local CN bib +authors: + - name: Tom Ben + - name: Ming Su + email: mingsu@rcees.ac.cn + orcid: 0000-0001-9821-1268 + url: https://drwater.net/team/ming-su/ +version: 0.3.2 +quarto-required: ">=1.3.0" +contributes: + filters: + - quotescnbib.lua diff --git a/_extensions/drwater/quotescnbib/_extensions/drwater/localizecnbib/quotescnbib.lua b/_extensions/drwater/quotescnbib/_extensions/drwater/localizecnbib/quotescnbib.lua new file mode 100644 index 0000000..1ffe926 --- /dev/null +++ b/_extensions/drwater/quotescnbib/_extensions/drwater/localizecnbib/quotescnbib.lua @@ -0,0 +1,137 @@ +-- Process quotes for Chinese bibliographies in HTML, EPUB, LaTeX and Typst + +--- Copyright: © 2024–Present Tom Ben +--- License: MIT License + +function is_chinese(text) + return text:find("[\228-\233][\128-\191][\128-\191]") +end + +local left_double_quote = "\226\128\156" -- “ +local right_double_quote = "\226\128\157" -- ” +local left_single_quote = "\226\128\152" -- ‘ +local right_single_quote = "\226\128\153" -- ’ + +local function stringify_inline(inline) + if inline.t == "Str" then + return inline.text + end + if pandoc.utils and pandoc.utils.stringify then + return pandoc.utils.stringify(inline) + end + return "" +end + +local function text_between(elements, start_idx, end_idx) + if end_idx <= start_idx + 1 then + return "" + end + local buffer = {} + for j = start_idx + 1, end_idx - 1 do + local text = stringify_inline(elements[j]) + if text ~= "" then + table.insert(buffer, text) + end + end + return table.concat(buffer) +end + +local function find_closing(elements, start_idx, target) + for j = start_idx, #elements do + local el = elements[j] + if el.t == "Str" and el.text == target then + return j + end + end + return nil +end + +local function process_default_quotes(block) + local elements = block.c + for i, el in ipairs(elements) do + if el.t == "Str" and (el.text == left_double_quote or el.text == right_double_quote) then + local prev_text = i > 1 and elements[i - 1].t == "Str" and elements[i - 1].text or "" + local next_text = i < #elements and elements[i + 1].t == "Str" and elements[i + 1].text or "" + + if is_chinese(prev_text) or is_chinese(next_text) then + local replaced_text + if FORMAT:match 'html' or FORMAT:match 'epub' then + replaced_text = (el.text == left_double_quote) and "「" or "」" + elseif FORMAT:match 'latex' then + replaced_text = (el.text == left_double_quote) and "«" or "»" + end + + if replaced_text then + elements[i] = pandoc.Str(replaced_text) + end + end + end + end + return block +end + +local function process_typst_quotes(block) + local elements = block.c + local processed = {} + local quote_pairs = { + { + left = left_double_quote, + right = right_double_quote, + latin = '"', + chinese_left = "«", + chinese_right = "»" + }, + { + left = left_single_quote, + right = right_single_quote, + latin = "'", + chinese_left = "‹", + chinese_right = "›" + } + } + + for i = 1, #elements do + if not processed[i] then + local el = elements[i] + if el.t == "Str" then + for _, quote in ipairs(quote_pairs) do + if el.text == quote.left then + local closing_idx = find_closing(elements, i + 1, quote.right) + if closing_idx then + local enclosed_text = text_between(elements, i, closing_idx) + local has_chinese = is_chinese(enclosed_text or "") + if has_chinese then + elements[i] = pandoc.Str(quote.chinese_left) + elements[closing_idx] = pandoc.Str(quote.chinese_right) + else + elements[i] = pandoc.RawInline("typst", quote.latin) + elements[closing_idx] = pandoc.RawInline("typst", quote.latin) + end + processed[closing_idx] = true + end + break + elseif el.text == quote.right then + processed[i] = true + end + end + end + end + end + return block +end + +function quotes_in_bib(block) + if FORMAT:match 'typst' then + return process_typst_quotes(block) + end + return process_default_quotes(block) +end + +function Pandoc(doc) + for i, block in ipairs(doc.blocks) do + if block.t == "Div" then + doc.blocks[i] = pandoc.walk_block(block, { Span = quotes_in_bib }) + end + end + return doc +end diff --git a/_extensions/drwater/quotescnbib/quotescnbib.lua b/_extensions/drwater/quotescnbib/quotescnbib.lua new file mode 100644 index 0000000..1ffe926 --- /dev/null +++ b/_extensions/drwater/quotescnbib/quotescnbib.lua @@ -0,0 +1,137 @@ +-- Process quotes for Chinese bibliographies in HTML, EPUB, LaTeX and Typst + +--- Copyright: © 2024–Present Tom Ben +--- License: MIT License + +function is_chinese(text) + return text:find("[\228-\233][\128-\191][\128-\191]") +end + +local left_double_quote = "\226\128\156" -- “ +local right_double_quote = "\226\128\157" -- ” +local left_single_quote = "\226\128\152" -- ‘ +local right_single_quote = "\226\128\153" -- ’ + +local function stringify_inline(inline) + if inline.t == "Str" then + return inline.text + end + if pandoc.utils and pandoc.utils.stringify then + return pandoc.utils.stringify(inline) + end + return "" +end + +local function text_between(elements, start_idx, end_idx) + if end_idx <= start_idx + 1 then + return "" + end + local buffer = {} + for j = start_idx + 1, end_idx - 1 do + local text = stringify_inline(elements[j]) + if text ~= "" then + table.insert(buffer, text) + end + end + return table.concat(buffer) +end + +local function find_closing(elements, start_idx, target) + for j = start_idx, #elements do + local el = elements[j] + if el.t == "Str" and el.text == target then + return j + end + end + return nil +end + +local function process_default_quotes(block) + local elements = block.c + for i, el in ipairs(elements) do + if el.t == "Str" and (el.text == left_double_quote or el.text == right_double_quote) then + local prev_text = i > 1 and elements[i - 1].t == "Str" and elements[i - 1].text or "" + local next_text = i < #elements and elements[i + 1].t == "Str" and elements[i + 1].text or "" + + if is_chinese(prev_text) or is_chinese(next_text) then + local replaced_text + if FORMAT:match 'html' or FORMAT:match 'epub' then + replaced_text = (el.text == left_double_quote) and "「" or "」" + elseif FORMAT:match 'latex' then + replaced_text = (el.text == left_double_quote) and "«" or "»" + end + + if replaced_text then + elements[i] = pandoc.Str(replaced_text) + end + end + end + end + return block +end + +local function process_typst_quotes(block) + local elements = block.c + local processed = {} + local quote_pairs = { + { + left = left_double_quote, + right = right_double_quote, + latin = '"', + chinese_left = "«", + chinese_right = "»" + }, + { + left = left_single_quote, + right = right_single_quote, + latin = "'", + chinese_left = "‹", + chinese_right = "›" + } + } + + for i = 1, #elements do + if not processed[i] then + local el = elements[i] + if el.t == "Str" then + for _, quote in ipairs(quote_pairs) do + if el.text == quote.left then + local closing_idx = find_closing(elements, i + 1, quote.right) + if closing_idx then + local enclosed_text = text_between(elements, i, closing_idx) + local has_chinese = is_chinese(enclosed_text or "") + if has_chinese then + elements[i] = pandoc.Str(quote.chinese_left) + elements[closing_idx] = pandoc.Str(quote.chinese_right) + else + elements[i] = pandoc.RawInline("typst", quote.latin) + elements[closing_idx] = pandoc.RawInline("typst", quote.latin) + end + processed[closing_idx] = true + end + break + elseif el.text == quote.right then + processed[i] = true + end + end + end + end + end + return block +end + +function quotes_in_bib(block) + if FORMAT:match 'typst' then + return process_typst_quotes(block) + end + return process_default_quotes(block) +end + +function Pandoc(doc) + for i, block in ipairs(doc.blocks) do + if block.t == "Div" then + doc.blocks[i] = pandoc.walk_block(block, { Span = quotes_in_bib }) + end + end + return doc +end diff --git a/_extensions/drwater/quotescnbib/template.qmd b/_extensions/drwater/quotescnbib/template.qmd new file mode 100644 index 0000000..17c081a --- /dev/null +++ b/_extensions/drwater/quotescnbib/template.qmd @@ -0,0 +1,116 @@ +--- +title: "MANUSCRIPT TITLE" +subtitle: "Supplementary Information" +submitjournal: "JOURNAL" +submitid: +lang: en +date: "" +# bibliography: [BB/Ref.bib, BB/localRef.bib] +affilstyle: alphabeta # number +author: + - name: Xxxxx Yyyy + affiliations: + - ref: kleac + # email: 13586740928@163.com + attributes: + corresponding: false + equal-contributor: true + role: + - data-curation: lead + - methodology: lead + - formalanalysis: lead + - writingoriginal: equal + - writingediting: eqaul + - visualisation: supporting + - name: Ming Su + email: mingsu@rcees.ac.cn + url: https://drwater.net/team/ming-su/ + role: + - conceptualization: lead + - methodology: supporting + - formalanalysis: lead + - writingoriginal: equal + - writingediting: equal + - visualisation: lead + - projectadmin: lead + - supervision + affiliations: + - ref: kleac + - ref: ucas + attributes: + corresponding: true + equal-contributor: true + - name: Min Yang + email: yangmin@rcees.ac.cn + affiliations: + - ref: kleac + - ref: ucas + attributes: + corresponding: true +affiliations: + - id: kleac + name: State Key Laboratory of Environmental Aquatic Chemistry, Research Center for Eco-Environmental Sciences, Chinese Academy of Sciences + # address: No. 18 Shuangqing Road + city: Beijing + postal-code: 100085 + country: China + url: https://www.skleac.ac.cn + - id: ucas + name: University of Chinese Academy of Sciences + # address: No. 19A Yuquan Road + city: Beijing + postal-code: 100049 + country: China + url: https://www.ucas.ac.cn +prefer-html: true +format: + # elsevier-html: + # toc: true + # css: _extensions/drwater/dwms/inst/css/style.css + # docx: + # reference-doc: _extensions/drwater/dwms/inst/word/MS.docx + pdf: + fontsize: 12pt + keep-md: false + keep-tex: false +filters: + # - latex-environment + # - authoraffil + - quotescnbib +--- + + +```{r} +#| include: false +#| cache: false + +lang <- "en" +isRendering <- isTRUE(getOption("knitr.in.progress")) +require(tidyverse) +require(drwateR) +require(patchwork) +rmdify::rmd_init() +dwfun::init() +``` + + +{{< pagebreak >}} + +# Abstract {-} + + +{{< pagebreak >}} + + +{{< pagebreak >}} + + + +# References {-} + +::: {#refs} +::: + +{{< pagebreak >}} + + diff --git a/_extensions/drwater/remove-spaces/_extension.yml b/_extensions/drwater/remove-spaces/_extension.yml new file mode 100644 index 0000000..44a16bc --- /dev/null +++ b/_extensions/drwater/remove-spaces/_extension.yml @@ -0,0 +1,7 @@ +title: Remove Spaces around Chinese Characters except Citations +author: Tom Ben +version: 1.0.0 +quarto-required: ">=1.5.0" +contributes: + filters: + - remove-spaces.lua diff --git a/_extensions/drwater/remove-spaces/remove-spaces.lua b/_extensions/drwater/remove-spaces/remove-spaces.lua new file mode 100644 index 0000000..4c3aa97 --- /dev/null +++ b/_extensions/drwater/remove-spaces/remove-spaces.lua @@ -0,0 +1,55 @@ +--- Remove spaces around Chinese characters except citations + +--- Copyright: © 2024–Present Tom Ben +--- License: MIT License + +-- Check if the character is non-ASCII (potentially a Chinese character). +local function is_non_ascii(char) + return char and string.byte(char) > 127 +end + +-- Process the paragraph to remove spaces adjacent to non-ASCII characters +local function process_paragraph(para) + local cs = para.content + local new_content = {} + + for i, elem in ipairs(cs) do + -- If the element is not a Space, always keep it + if elem.t ~= 'Space' then + table.insert(new_content, elem) + else + -- Element is a Space, determine whether to keep it + local next_elem = cs[i + 1] + local prev_elem = cs[i - 1] + + -- Check adjacent characters for Chinese text + local next_char = next_elem and next_elem.t == 'Str' and next_elem.text:sub(1, 1) + local prev_char = prev_elem and prev_elem.t == 'Str' and prev_elem.text:sub(-1) + + -- Check if adjacent elements are citations or citation-related elements + local next_is_cite = next_elem and (next_elem.t == 'Cite' or next_elem.t == 'Note') + local prev_is_cite = prev_elem and (prev_elem.t == 'Cite' or prev_elem.t == 'Note') + + -- Determine if we need to remove this space + local has_adjacent_chinese = (next_char and is_non_ascii(next_char)) or (prev_char and is_non_ascii(prev_char)) + local is_adjacent_to_cite = (prev_is_cite and next_char and is_non_ascii(next_char)) or + (next_is_cite and prev_char and is_non_ascii(prev_char)) + + -- Keep space if: + -- 1. It's not adjacent to Chinese characters, OR + -- 2. It's between a citation and Chinese characters + if not has_adjacent_chinese or is_adjacent_to_cite then + table.insert(new_content, elem) + end + -- Otherwise, remove the space (by not adding it to new_content) + end + end + + para.content = new_content + return para +end + +-- Return the filter for Pandoc +return { + { Para = process_paragraph } +} diff --git a/_extensions/drwater/social-share/_extension.yml b/_extensions/drwater/social-share/_extension.yml new file mode 100644 index 0000000..ba9f0f1 --- /dev/null +++ b/_extensions/drwater/social-share/_extension.yml @@ -0,0 +1,6 @@ +title: Share Post on Social Media +author: David Schoch +version: 1.0.0 +contributes: + filters: + - social-share.lua diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/_extension.yml b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/_extension.yml new file mode 100644 index 0000000..dc17906 --- /dev/null +++ b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/_extension.yml @@ -0,0 +1,7 @@ +title: Font Awesome support +author: Carlos Scheidegger +version: 1.2.0 +quarto-required: ">=1.2.269" +contributes: + shortcodes: + - fontawesome.lua \ No newline at end of file diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/css/all.css b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/css/all.css new file mode 100644 index 0000000..7e4dfe1 --- /dev/null +++ b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/css/all.css @@ -0,0 +1,8030 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa { + font-family: var(--fa-style-family, "Font Awesome 6 Free"); + font-weight: var(--fa-style, 900); } + +.fa, +.fa-classic, +.fa-sharp, +.fas, +.fa-solid, +.far, +.fa-regular, +.fab, +.fa-brands { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: var(--fa-display, inline-block); + font-style: normal; + font-variant: normal; + line-height: 1; + text-rendering: auto; } + +.fas, +.fa-classic, +.fa-solid, +.far, +.fa-regular { + font-family: 'Font Awesome 6 Free'; } + +.fab, +.fa-brands { + font-family: 'Font Awesome 6 Brands'; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; } + +.fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; } + +.fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; } + +.fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; } + +.fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; } + +.fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: calc(var(--fa-li-width, 2em) * -1); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; } + +.fa-border { + border-color: var(--fa-border-color, #eee); + border-radius: var(--fa-border-radius, 0.1em); + border-style: var(--fa-border-style, solid); + border-width: var(--fa-border-width, 0.08em); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } + +.fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); } + +.fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); } + +.fa-beat { + -webkit-animation-name: fa-beat; + animation-name: fa-beat; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-bounce { + -webkit-animation-name: fa-bounce; + animation-name: fa-bounce; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } + +.fa-fade { + -webkit-animation-name: fa-fade; + animation-name: fa-fade; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-beat-fade { + -webkit-animation-name: fa-beat-fade; + animation-name: fa-beat-fade; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-flip { + -webkit-animation-name: fa-flip; + animation-name: fa-flip; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-shake { + -webkit-animation-name: fa-shake; + animation-name: fa-shake; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 2s); + animation-duration: var(--fa-animation-duration, 2s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin-reverse { + --fa-animation-direction: reverse; } + +.fa-pulse, +.fa-spin-pulse { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, steps(8)); + animation-timing-function: var(--fa-animation-timing, steps(8)); } + +@media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-bounce, + .fa-fade, + .fa-beat-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + -webkit-animation-delay: -1ms; + animation-delay: -1ms; + -webkit-animation-duration: 1ms; + animation-duration: 1ms; + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + -webkit-transition-delay: 0s; + transition-delay: 0s; + -webkit-transition-duration: 0s; + transition-duration: 0s; } } + +@-webkit-keyframes fa-beat { + 0%, 90% { + -webkit-transform: scale(1); + transform: scale(1); } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@keyframes fa-beat { + 0%, 90% { + -webkit-transform: scale(1); + transform: scale(1); } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@-webkit-keyframes fa-bounce { + 0% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 10% { + -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 100% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } } + +@keyframes fa-bounce { + 0% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 10% { + -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 100% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } } + +@-webkit-keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@-webkit-keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@-webkit-keyframes fa-flip { + 50% { + -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@keyframes fa-flip { + 50% { + -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@-webkit-keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); } + 8%, 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); } + 12%, 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); } + 40%, 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } } + +@keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); } + 8%, 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); } + 12%, 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); } + 40%, 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +.fa-rotate-by { + -webkit-transform: rotate(var(--fa-rotate-angle, 0)); + transform: rotate(var(--fa-rotate-angle, 0)); } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; + z-index: var(--fa-stack-z-index, auto); } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: var(--fa-inverse, #fff); } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ + +.fa-0::before { + content: "\30"; } + +.fa-1::before { + content: "\31"; } + +.fa-2::before { + content: "\32"; } + +.fa-3::before { + content: "\33"; } + +.fa-4::before { + content: "\34"; } + +.fa-5::before { + content: "\35"; } + +.fa-6::before { + content: "\36"; } + +.fa-7::before { + content: "\37"; } + +.fa-8::before { + content: "\38"; } + +.fa-9::before { + content: "\39"; } + +.fa-fill-drip::before { + content: "\f576"; } + +.fa-arrows-to-circle::before { + content: "\e4bd"; } + +.fa-circle-chevron-right::before { + content: "\f138"; } + +.fa-chevron-circle-right::before { + content: "\f138"; } + +.fa-at::before { + content: "\40"; } + +.fa-trash-can::before { + content: "\f2ed"; } + +.fa-trash-alt::before { + content: "\f2ed"; } + +.fa-text-height::before { + content: "\f034"; } + +.fa-user-xmark::before { + content: "\f235"; } + +.fa-user-times::before { + content: "\f235"; } + +.fa-stethoscope::before { + content: "\f0f1"; } + +.fa-message::before { + content: "\f27a"; } + +.fa-comment-alt::before { + content: "\f27a"; } + +.fa-info::before { + content: "\f129"; } + +.fa-down-left-and-up-right-to-center::before { + content: "\f422"; } + +.fa-compress-alt::before { + content: "\f422"; } + +.fa-explosion::before { + content: "\e4e9"; } + +.fa-file-lines::before { + content: "\f15c"; } + +.fa-file-alt::before { + content: "\f15c"; } + +.fa-file-text::before { + content: "\f15c"; } + +.fa-wave-square::before { + content: "\f83e"; } + +.fa-ring::before { + content: "\f70b"; } + +.fa-building-un::before { + content: "\e4d9"; } + +.fa-dice-three::before { + content: "\f527"; } + +.fa-calendar-days::before { + content: "\f073"; } + +.fa-calendar-alt::before { + content: "\f073"; } + +.fa-anchor-circle-check::before { + content: "\e4aa"; } + +.fa-building-circle-arrow-right::before { + content: "\e4d1"; } + +.fa-volleyball::before { + content: "\f45f"; } + +.fa-volleyball-ball::before { + content: "\f45f"; } + +.fa-arrows-up-to-line::before { + content: "\e4c2"; } + +.fa-sort-down::before { + content: "\f0dd"; } + +.fa-sort-desc::before { + content: "\f0dd"; } + +.fa-circle-minus::before { + content: "\f056"; } + +.fa-minus-circle::before { + content: "\f056"; } + +.fa-door-open::before { + content: "\f52b"; } + +.fa-right-from-bracket::before { + content: "\f2f5"; } + +.fa-sign-out-alt::before { + content: "\f2f5"; } + +.fa-atom::before { + content: "\f5d2"; } + +.fa-soap::before { + content: "\e06e"; } + +.fa-icons::before { + content: "\f86d"; } + +.fa-heart-music-camera-bolt::before { + content: "\f86d"; } + +.fa-microphone-lines-slash::before { + content: "\f539"; } + +.fa-microphone-alt-slash::before { + content: "\f539"; } + +.fa-bridge-circle-check::before { + content: "\e4c9"; } + +.fa-pump-medical::before { + content: "\e06a"; } + +.fa-fingerprint::before { + content: "\f577"; } + +.fa-hand-point-right::before { + content: "\f0a4"; } + +.fa-magnifying-glass-location::before { + content: "\f689"; } + +.fa-search-location::before { + content: "\f689"; } + +.fa-forward-step::before { + content: "\f051"; } + +.fa-step-forward::before { + content: "\f051"; } + +.fa-face-smile-beam::before { + content: "\f5b8"; } + +.fa-smile-beam::before { + content: "\f5b8"; } + +.fa-flag-checkered::before { + content: "\f11e"; } + +.fa-football::before { + content: "\f44e"; } + +.fa-football-ball::before { + content: "\f44e"; } + +.fa-school-circle-exclamation::before { + content: "\e56c"; } + +.fa-crop::before { + content: "\f125"; } + +.fa-angles-down::before { + content: "\f103"; } + +.fa-angle-double-down::before { + content: "\f103"; } + +.fa-users-rectangle::before { + content: "\e594"; } + +.fa-people-roof::before { + content: "\e537"; } + +.fa-people-line::before { + content: "\e534"; } + +.fa-beer-mug-empty::before { + content: "\f0fc"; } + +.fa-beer::before { + content: "\f0fc"; } + +.fa-diagram-predecessor::before { + content: "\e477"; } + +.fa-arrow-up-long::before { + content: "\f176"; } + +.fa-long-arrow-up::before { + content: "\f176"; } + +.fa-fire-flame-simple::before { + content: "\f46a"; } + +.fa-burn::before { + content: "\f46a"; } + +.fa-person::before { + content: "\f183"; } + +.fa-male::before { + content: "\f183"; } + +.fa-laptop::before { + content: "\f109"; } + +.fa-file-csv::before { + content: "\f6dd"; } + +.fa-menorah::before { + content: "\f676"; } + +.fa-truck-plane::before { + content: "\e58f"; } + +.fa-record-vinyl::before { + content: "\f8d9"; } + +.fa-face-grin-stars::before { + content: "\f587"; } + +.fa-grin-stars::before { + content: "\f587"; } + +.fa-bong::before { + content: "\f55c"; } + +.fa-spaghetti-monster-flying::before { + content: "\f67b"; } + +.fa-pastafarianism::before { + content: "\f67b"; } + +.fa-arrow-down-up-across-line::before { + content: "\e4af"; } + +.fa-spoon::before { + content: "\f2e5"; } + +.fa-utensil-spoon::before { + content: "\f2e5"; } + +.fa-jar-wheat::before { + content: "\e517"; } + +.fa-envelopes-bulk::before { + content: "\f674"; } + +.fa-mail-bulk::before { + content: "\f674"; } + +.fa-file-circle-exclamation::before { + content: "\e4eb"; } + +.fa-circle-h::before { + content: "\f47e"; } + +.fa-hospital-symbol::before { + content: "\f47e"; } + +.fa-pager::before { + content: "\f815"; } + +.fa-address-book::before { + content: "\f2b9"; } + +.fa-contact-book::before { + content: "\f2b9"; } + +.fa-strikethrough::before { + content: "\f0cc"; } + +.fa-k::before { + content: "\4b"; } + +.fa-landmark-flag::before { + content: "\e51c"; } + +.fa-pencil::before { + content: "\f303"; } + +.fa-pencil-alt::before { + content: "\f303"; } + +.fa-backward::before { + content: "\f04a"; } + +.fa-caret-right::before { + content: "\f0da"; } + +.fa-comments::before { + content: "\f086"; } + +.fa-paste::before { + content: "\f0ea"; } + +.fa-file-clipboard::before { + content: "\f0ea"; } + +.fa-code-pull-request::before { + content: "\e13c"; } + +.fa-clipboard-list::before { + content: "\f46d"; } + +.fa-truck-ramp-box::before { + content: "\f4de"; } + +.fa-truck-loading::before { + content: "\f4de"; } + +.fa-user-check::before { + content: "\f4fc"; } + +.fa-vial-virus::before { + content: "\e597"; } + +.fa-sheet-plastic::before { + content: "\e571"; } + +.fa-blog::before { + content: "\f781"; } + +.fa-user-ninja::before { + content: "\f504"; } + +.fa-person-arrow-up-from-line::before { + content: "\e539"; } + +.fa-scroll-torah::before { + content: "\f6a0"; } + +.fa-torah::before { + content: "\f6a0"; } + +.fa-broom-ball::before { + content: "\f458"; } + +.fa-quidditch::before { + content: "\f458"; } + +.fa-quidditch-broom-ball::before { + content: "\f458"; } + +.fa-toggle-off::before { + content: "\f204"; } + +.fa-box-archive::before { + content: "\f187"; } + +.fa-archive::before { + content: "\f187"; } + +.fa-person-drowning::before { + content: "\e545"; } + +.fa-arrow-down-9-1::before { + content: "\f886"; } + +.fa-sort-numeric-desc::before { + content: "\f886"; } + +.fa-sort-numeric-down-alt::before { + content: "\f886"; } + +.fa-face-grin-tongue-squint::before { + content: "\f58a"; } + +.fa-grin-tongue-squint::before { + content: "\f58a"; } + +.fa-spray-can::before { + content: "\f5bd"; } + +.fa-truck-monster::before { + content: "\f63b"; } + +.fa-w::before { + content: "\57"; } + +.fa-earth-africa::before { + content: "\f57c"; } + +.fa-globe-africa::before { + content: "\f57c"; } + +.fa-rainbow::before { + content: "\f75b"; } + +.fa-circle-notch::before { + content: "\f1ce"; } + +.fa-tablet-screen-button::before { + content: "\f3fa"; } + +.fa-tablet-alt::before { + content: "\f3fa"; } + +.fa-paw::before { + content: "\f1b0"; } + +.fa-cloud::before { + content: "\f0c2"; } + +.fa-trowel-bricks::before { + content: "\e58a"; } + +.fa-face-flushed::before { + content: "\f579"; } + +.fa-flushed::before { + content: "\f579"; } + +.fa-hospital-user::before { + content: "\f80d"; } + +.fa-tent-arrow-left-right::before { + content: "\e57f"; } + +.fa-gavel::before { + content: "\f0e3"; } + +.fa-legal::before { + content: "\f0e3"; } + +.fa-binoculars::before { + content: "\f1e5"; } + +.fa-microphone-slash::before { + content: "\f131"; } + +.fa-box-tissue::before { + content: "\e05b"; } + +.fa-motorcycle::before { + content: "\f21c"; } + +.fa-bell-concierge::before { + content: "\f562"; } + +.fa-concierge-bell::before { + content: "\f562"; } + +.fa-pen-ruler::before { + content: "\f5ae"; } + +.fa-pencil-ruler::before { + content: "\f5ae"; } + +.fa-people-arrows::before { + content: "\e068"; } + +.fa-people-arrows-left-right::before { + content: "\e068"; } + +.fa-mars-and-venus-burst::before { + content: "\e523"; } + +.fa-square-caret-right::before { + content: "\f152"; } + +.fa-caret-square-right::before { + content: "\f152"; } + +.fa-scissors::before { + content: "\f0c4"; } + +.fa-cut::before { + content: "\f0c4"; } + +.fa-sun-plant-wilt::before { + content: "\e57a"; } + +.fa-toilets-portable::before { + content: "\e584"; } + +.fa-hockey-puck::before { + content: "\f453"; } + +.fa-table::before { + content: "\f0ce"; } + +.fa-magnifying-glass-arrow-right::before { + content: "\e521"; } + +.fa-tachograph-digital::before { + content: "\f566"; } + +.fa-digital-tachograph::before { + content: "\f566"; } + +.fa-users-slash::before { + content: "\e073"; } + +.fa-clover::before { + content: "\e139"; } + +.fa-reply::before { + content: "\f3e5"; } + +.fa-mail-reply::before { + content: "\f3e5"; } + +.fa-star-and-crescent::before { + content: "\f699"; } + +.fa-house-fire::before { + content: "\e50c"; } + +.fa-square-minus::before { + content: "\f146"; } + +.fa-minus-square::before { + content: "\f146"; } + +.fa-helicopter::before { + content: "\f533"; } + +.fa-compass::before { + content: "\f14e"; } + +.fa-square-caret-down::before { + content: "\f150"; } + +.fa-caret-square-down::before { + content: "\f150"; } + +.fa-file-circle-question::before { + content: "\e4ef"; } + +.fa-laptop-code::before { + content: "\f5fc"; } + +.fa-swatchbook::before { + content: "\f5c3"; } + +.fa-prescription-bottle::before { + content: "\f485"; } + +.fa-bars::before { + content: "\f0c9"; } + +.fa-navicon::before { + content: "\f0c9"; } + +.fa-people-group::before { + content: "\e533"; } + +.fa-hourglass-end::before { + content: "\f253"; } + +.fa-hourglass-3::before { + content: "\f253"; } + +.fa-heart-crack::before { + content: "\f7a9"; } + +.fa-heart-broken::before { + content: "\f7a9"; } + +.fa-square-up-right::before { + content: "\f360"; } + +.fa-external-link-square-alt::before { + content: "\f360"; } + +.fa-face-kiss-beam::before { + content: "\f597"; } + +.fa-kiss-beam::before { + content: "\f597"; } + +.fa-film::before { + content: "\f008"; } + +.fa-ruler-horizontal::before { + content: "\f547"; } + +.fa-people-robbery::before { + content: "\e536"; } + +.fa-lightbulb::before { + content: "\f0eb"; } + +.fa-caret-left::before { + content: "\f0d9"; } + +.fa-circle-exclamation::before { + content: "\f06a"; } + +.fa-exclamation-circle::before { + content: "\f06a"; } + +.fa-school-circle-xmark::before { + content: "\e56d"; } + +.fa-arrow-right-from-bracket::before { + content: "\f08b"; } + +.fa-sign-out::before { + content: "\f08b"; } + +.fa-circle-chevron-down::before { + content: "\f13a"; } + +.fa-chevron-circle-down::before { + content: "\f13a"; } + +.fa-unlock-keyhole::before { + content: "\f13e"; } + +.fa-unlock-alt::before { + content: "\f13e"; } + +.fa-cloud-showers-heavy::before { + content: "\f740"; } + +.fa-headphones-simple::before { + content: "\f58f"; } + +.fa-headphones-alt::before { + content: "\f58f"; } + +.fa-sitemap::before { + content: "\f0e8"; } + +.fa-circle-dollar-to-slot::before { + content: "\f4b9"; } + +.fa-donate::before { + content: "\f4b9"; } + +.fa-memory::before { + content: "\f538"; } + +.fa-road-spikes::before { + content: "\e568"; } + +.fa-fire-burner::before { + content: "\e4f1"; } + +.fa-flag::before { + content: "\f024"; } + +.fa-hanukiah::before { + content: "\f6e6"; } + +.fa-feather::before { + content: "\f52d"; } + +.fa-volume-low::before { + content: "\f027"; } + +.fa-volume-down::before { + content: "\f027"; } + +.fa-comment-slash::before { + content: "\f4b3"; } + +.fa-cloud-sun-rain::before { + content: "\f743"; } + +.fa-compress::before { + content: "\f066"; } + +.fa-wheat-awn::before { + content: "\e2cd"; } + +.fa-wheat-alt::before { + content: "\e2cd"; } + +.fa-ankh::before { + content: "\f644"; } + +.fa-hands-holding-child::before { + content: "\e4fa"; } + +.fa-asterisk::before { + content: "\2a"; } + +.fa-square-check::before { + content: "\f14a"; } + +.fa-check-square::before { + content: "\f14a"; } + +.fa-peseta-sign::before { + content: "\e221"; } + +.fa-heading::before { + content: "\f1dc"; } + +.fa-header::before { + content: "\f1dc"; } + +.fa-ghost::before { + content: "\f6e2"; } + +.fa-list::before { + content: "\f03a"; } + +.fa-list-squares::before { + content: "\f03a"; } + +.fa-square-phone-flip::before { + content: "\f87b"; } + +.fa-phone-square-alt::before { + content: "\f87b"; } + +.fa-cart-plus::before { + content: "\f217"; } + +.fa-gamepad::before { + content: "\f11b"; } + +.fa-circle-dot::before { + content: "\f192"; } + +.fa-dot-circle::before { + content: "\f192"; } + +.fa-face-dizzy::before { + content: "\f567"; } + +.fa-dizzy::before { + content: "\f567"; } + +.fa-egg::before { + content: "\f7fb"; } + +.fa-house-medical-circle-xmark::before { + content: "\e513"; } + +.fa-campground::before { + content: "\f6bb"; } + +.fa-folder-plus::before { + content: "\f65e"; } + +.fa-futbol::before { + content: "\f1e3"; } + +.fa-futbol-ball::before { + content: "\f1e3"; } + +.fa-soccer-ball::before { + content: "\f1e3"; } + +.fa-paintbrush::before { + content: "\f1fc"; } + +.fa-paint-brush::before { + content: "\f1fc"; } + +.fa-lock::before { + content: "\f023"; } + +.fa-gas-pump::before { + content: "\f52f"; } + +.fa-hot-tub-person::before { + content: "\f593"; } + +.fa-hot-tub::before { + content: "\f593"; } + +.fa-map-location::before { + content: "\f59f"; } + +.fa-map-marked::before { + content: "\f59f"; } + +.fa-house-flood-water::before { + content: "\e50e"; } + +.fa-tree::before { + content: "\f1bb"; } + +.fa-bridge-lock::before { + content: "\e4cc"; } + +.fa-sack-dollar::before { + content: "\f81d"; } + +.fa-pen-to-square::before { + content: "\f044"; } + +.fa-edit::before { + content: "\f044"; } + +.fa-car-side::before { + content: "\f5e4"; } + +.fa-share-nodes::before { + content: "\f1e0"; } + +.fa-share-alt::before { + content: "\f1e0"; } + +.fa-heart-circle-minus::before { + content: "\e4ff"; } + +.fa-hourglass-half::before { + content: "\f252"; } + +.fa-hourglass-2::before { + content: "\f252"; } + +.fa-microscope::before { + content: "\f610"; } + +.fa-sink::before { + content: "\e06d"; } + +.fa-bag-shopping::before { + content: "\f290"; } + +.fa-shopping-bag::before { + content: "\f290"; } + +.fa-arrow-down-z-a::before { + content: "\f881"; } + +.fa-sort-alpha-desc::before { + content: "\f881"; } + +.fa-sort-alpha-down-alt::before { + content: "\f881"; } + +.fa-mitten::before { + content: "\f7b5"; } + +.fa-person-rays::before { + content: "\e54d"; } + +.fa-users::before { + content: "\f0c0"; } + +.fa-eye-slash::before { + content: "\f070"; } + +.fa-flask-vial::before { + content: "\e4f3"; } + +.fa-hand::before { + content: "\f256"; } + +.fa-hand-paper::before { + content: "\f256"; } + +.fa-om::before { + content: "\f679"; } + +.fa-worm::before { + content: "\e599"; } + +.fa-house-circle-xmark::before { + content: "\e50b"; } + +.fa-plug::before { + content: "\f1e6"; } + +.fa-chevron-up::before { + content: "\f077"; } + +.fa-hand-spock::before { + content: "\f259"; } + +.fa-stopwatch::before { + content: "\f2f2"; } + +.fa-face-kiss::before { + content: "\f596"; } + +.fa-kiss::before { + content: "\f596"; } + +.fa-bridge-circle-xmark::before { + content: "\e4cb"; } + +.fa-face-grin-tongue::before { + content: "\f589"; } + +.fa-grin-tongue::before { + content: "\f589"; } + +.fa-chess-bishop::before { + content: "\f43a"; } + +.fa-face-grin-wink::before { + content: "\f58c"; } + +.fa-grin-wink::before { + content: "\f58c"; } + +.fa-ear-deaf::before { + content: "\f2a4"; } + +.fa-deaf::before { + content: "\f2a4"; } + +.fa-deafness::before { + content: "\f2a4"; } + +.fa-hard-of-hearing::before { + content: "\f2a4"; } + +.fa-road-circle-check::before { + content: "\e564"; } + +.fa-dice-five::before { + content: "\f523"; } + +.fa-square-rss::before { + content: "\f143"; } + +.fa-rss-square::before { + content: "\f143"; } + +.fa-land-mine-on::before { + content: "\e51b"; } + +.fa-i-cursor::before { + content: "\f246"; } + +.fa-stamp::before { + content: "\f5bf"; } + +.fa-stairs::before { + content: "\e289"; } + +.fa-i::before { + content: "\49"; } + +.fa-hryvnia-sign::before { + content: "\f6f2"; } + +.fa-hryvnia::before { + content: "\f6f2"; } + +.fa-pills::before { + content: "\f484"; } + +.fa-face-grin-wide::before { + content: "\f581"; } + +.fa-grin-alt::before { + content: "\f581"; } + +.fa-tooth::before { + content: "\f5c9"; } + +.fa-v::before { + content: "\56"; } + +.fa-bangladeshi-taka-sign::before { + content: "\e2e6"; } + +.fa-bicycle::before { + content: "\f206"; } + +.fa-staff-snake::before { + content: "\e579"; } + +.fa-rod-asclepius::before { + content: "\e579"; } + +.fa-rod-snake::before { + content: "\e579"; } + +.fa-staff-aesculapius::before { + content: "\e579"; } + +.fa-head-side-cough-slash::before { + content: "\e062"; } + +.fa-truck-medical::before { + content: "\f0f9"; } + +.fa-ambulance::before { + content: "\f0f9"; } + +.fa-wheat-awn-circle-exclamation::before { + content: "\e598"; } + +.fa-snowman::before { + content: "\f7d0"; } + +.fa-mortar-pestle::before { + content: "\f5a7"; } + +.fa-road-barrier::before { + content: "\e562"; } + +.fa-school::before { + content: "\f549"; } + +.fa-igloo::before { + content: "\f7ae"; } + +.fa-joint::before { + content: "\f595"; } + +.fa-angle-right::before { + content: "\f105"; } + +.fa-horse::before { + content: "\f6f0"; } + +.fa-q::before { + content: "\51"; } + +.fa-g::before { + content: "\47"; } + +.fa-notes-medical::before { + content: "\f481"; } + +.fa-temperature-half::before { + content: "\f2c9"; } + +.fa-temperature-2::before { + content: "\f2c9"; } + +.fa-thermometer-2::before { + content: "\f2c9"; } + +.fa-thermometer-half::before { + content: "\f2c9"; } + +.fa-dong-sign::before { + content: "\e169"; } + +.fa-capsules::before { + content: "\f46b"; } + +.fa-poo-storm::before { + content: "\f75a"; } + +.fa-poo-bolt::before { + content: "\f75a"; } + +.fa-face-frown-open::before { + content: "\f57a"; } + +.fa-frown-open::before { + content: "\f57a"; } + +.fa-hand-point-up::before { + content: "\f0a6"; } + +.fa-money-bill::before { + content: "\f0d6"; } + +.fa-bookmark::before { + content: "\f02e"; } + +.fa-align-justify::before { + content: "\f039"; } + +.fa-umbrella-beach::before { + content: "\f5ca"; } + +.fa-helmet-un::before { + content: "\e503"; } + +.fa-bullseye::before { + content: "\f140"; } + +.fa-bacon::before { + content: "\f7e5"; } + +.fa-hand-point-down::before { + content: "\f0a7"; } + +.fa-arrow-up-from-bracket::before { + content: "\e09a"; } + +.fa-folder::before { + content: "\f07b"; } + +.fa-folder-blank::before { + content: "\f07b"; } + +.fa-file-waveform::before { + content: "\f478"; } + +.fa-file-medical-alt::before { + content: "\f478"; } + +.fa-radiation::before { + content: "\f7b9"; } + +.fa-chart-simple::before { + content: "\e473"; } + +.fa-mars-stroke::before { + content: "\f229"; } + +.fa-vial::before { + content: "\f492"; } + +.fa-gauge::before { + content: "\f624"; } + +.fa-dashboard::before { + content: "\f624"; } + +.fa-gauge-med::before { + content: "\f624"; } + +.fa-tachometer-alt-average::before { + content: "\f624"; } + +.fa-wand-magic-sparkles::before { + content: "\e2ca"; } + +.fa-magic-wand-sparkles::before { + content: "\e2ca"; } + +.fa-e::before { + content: "\45"; } + +.fa-pen-clip::before { + content: "\f305"; } + +.fa-pen-alt::before { + content: "\f305"; } + +.fa-bridge-circle-exclamation::before { + content: "\e4ca"; } + +.fa-user::before { + content: "\f007"; } + +.fa-school-circle-check::before { + content: "\e56b"; } + +.fa-dumpster::before { + content: "\f793"; } + +.fa-van-shuttle::before { + content: "\f5b6"; } + +.fa-shuttle-van::before { + content: "\f5b6"; } + +.fa-building-user::before { + content: "\e4da"; } + +.fa-square-caret-left::before { + content: "\f191"; } + +.fa-caret-square-left::before { + content: "\f191"; } + +.fa-highlighter::before { + content: "\f591"; } + +.fa-key::before { + content: "\f084"; } + +.fa-bullhorn::before { + content: "\f0a1"; } + +.fa-globe::before { + content: "\f0ac"; } + +.fa-synagogue::before { + content: "\f69b"; } + +.fa-person-half-dress::before { + content: "\e548"; } + +.fa-road-bridge::before { + content: "\e563"; } + +.fa-location-arrow::before { + content: "\f124"; } + +.fa-c::before { + content: "\43"; } + +.fa-tablet-button::before { + content: "\f10a"; } + +.fa-building-lock::before { + content: "\e4d6"; } + +.fa-pizza-slice::before { + content: "\f818"; } + +.fa-money-bill-wave::before { + content: "\f53a"; } + +.fa-chart-area::before { + content: "\f1fe"; } + +.fa-area-chart::before { + content: "\f1fe"; } + +.fa-house-flag::before { + content: "\e50d"; } + +.fa-person-circle-minus::before { + content: "\e540"; } + +.fa-ban::before { + content: "\f05e"; } + +.fa-cancel::before { + content: "\f05e"; } + +.fa-camera-rotate::before { + content: "\e0d8"; } + +.fa-spray-can-sparkles::before { + content: "\f5d0"; } + +.fa-air-freshener::before { + content: "\f5d0"; } + +.fa-star::before { + content: "\f005"; } + +.fa-repeat::before { + content: "\f363"; } + +.fa-cross::before { + content: "\f654"; } + +.fa-box::before { + content: "\f466"; } + +.fa-venus-mars::before { + content: "\f228"; } + +.fa-arrow-pointer::before { + content: "\f245"; } + +.fa-mouse-pointer::before { + content: "\f245"; } + +.fa-maximize::before { + content: "\f31e"; } + +.fa-expand-arrows-alt::before { + content: "\f31e"; } + +.fa-charging-station::before { + content: "\f5e7"; } + +.fa-shapes::before { + content: "\f61f"; } + +.fa-triangle-circle-square::before { + content: "\f61f"; } + +.fa-shuffle::before { + content: "\f074"; } + +.fa-random::before { + content: "\f074"; } + +.fa-person-running::before { + content: "\f70c"; } + +.fa-running::before { + content: "\f70c"; } + +.fa-mobile-retro::before { + content: "\e527"; } + +.fa-grip-lines-vertical::before { + content: "\f7a5"; } + +.fa-spider::before { + content: "\f717"; } + +.fa-hands-bound::before { + content: "\e4f9"; } + +.fa-file-invoice-dollar::before { + content: "\f571"; } + +.fa-plane-circle-exclamation::before { + content: "\e556"; } + +.fa-x-ray::before { + content: "\f497"; } + +.fa-spell-check::before { + content: "\f891"; } + +.fa-slash::before { + content: "\f715"; } + +.fa-computer-mouse::before { + content: "\f8cc"; } + +.fa-mouse::before { + content: "\f8cc"; } + +.fa-arrow-right-to-bracket::before { + content: "\f090"; } + +.fa-sign-in::before { + content: "\f090"; } + +.fa-shop-slash::before { + content: "\e070"; } + +.fa-store-alt-slash::before { + content: "\e070"; } + +.fa-server::before { + content: "\f233"; } + +.fa-virus-covid-slash::before { + content: "\e4a9"; } + +.fa-shop-lock::before { + content: "\e4a5"; } + +.fa-hourglass-start::before { + content: "\f251"; } + +.fa-hourglass-1::before { + content: "\f251"; } + +.fa-blender-phone::before { + content: "\f6b6"; } + +.fa-building-wheat::before { + content: "\e4db"; } + +.fa-person-breastfeeding::before { + content: "\e53a"; } + +.fa-right-to-bracket::before { + content: "\f2f6"; } + +.fa-sign-in-alt::before { + content: "\f2f6"; } + +.fa-venus::before { + content: "\f221"; } + +.fa-passport::before { + content: "\f5ab"; } + +.fa-heart-pulse::before { + content: "\f21e"; } + +.fa-heartbeat::before { + content: "\f21e"; } + +.fa-people-carry-box::before { + content: "\f4ce"; } + +.fa-people-carry::before { + content: "\f4ce"; } + +.fa-temperature-high::before { + content: "\f769"; } + +.fa-microchip::before { + content: "\f2db"; } + +.fa-crown::before { + content: "\f521"; } + +.fa-weight-hanging::before { + content: "\f5cd"; } + +.fa-xmarks-lines::before { + content: "\e59a"; } + +.fa-file-prescription::before { + content: "\f572"; } + +.fa-weight-scale::before { + content: "\f496"; } + +.fa-weight::before { + content: "\f496"; } + +.fa-user-group::before { + content: "\f500"; } + +.fa-user-friends::before { + content: "\f500"; } + +.fa-arrow-up-a-z::before { + content: "\f15e"; } + +.fa-sort-alpha-up::before { + content: "\f15e"; } + +.fa-chess-knight::before { + content: "\f441"; } + +.fa-face-laugh-squint::before { + content: "\f59b"; } + +.fa-laugh-squint::before { + content: "\f59b"; } + +.fa-wheelchair::before { + content: "\f193"; } + +.fa-circle-arrow-up::before { + content: "\f0aa"; } + +.fa-arrow-circle-up::before { + content: "\f0aa"; } + +.fa-toggle-on::before { + content: "\f205"; } + +.fa-person-walking::before { + content: "\f554"; } + +.fa-walking::before { + content: "\f554"; } + +.fa-l::before { + content: "\4c"; } + +.fa-fire::before { + content: "\f06d"; } + +.fa-bed-pulse::before { + content: "\f487"; } + +.fa-procedures::before { + content: "\f487"; } + +.fa-shuttle-space::before { + content: "\f197"; } + +.fa-space-shuttle::before { + content: "\f197"; } + +.fa-face-laugh::before { + content: "\f599"; } + +.fa-laugh::before { + content: "\f599"; } + +.fa-folder-open::before { + content: "\f07c"; } + +.fa-heart-circle-plus::before { + content: "\e500"; } + +.fa-code-fork::before { + content: "\e13b"; } + +.fa-city::before { + content: "\f64f"; } + +.fa-microphone-lines::before { + content: "\f3c9"; } + +.fa-microphone-alt::before { + content: "\f3c9"; } + +.fa-pepper-hot::before { + content: "\f816"; } + +.fa-unlock::before { + content: "\f09c"; } + +.fa-colon-sign::before { + content: "\e140"; } + +.fa-headset::before { + content: "\f590"; } + +.fa-store-slash::before { + content: "\e071"; } + +.fa-road-circle-xmark::before { + content: "\e566"; } + +.fa-user-minus::before { + content: "\f503"; } + +.fa-mars-stroke-up::before { + content: "\f22a"; } + +.fa-mars-stroke-v::before { + content: "\f22a"; } + +.fa-champagne-glasses::before { + content: "\f79f"; } + +.fa-glass-cheers::before { + content: "\f79f"; } + +.fa-clipboard::before { + content: "\f328"; } + +.fa-house-circle-exclamation::before { + content: "\e50a"; } + +.fa-file-arrow-up::before { + content: "\f574"; } + +.fa-file-upload::before { + content: "\f574"; } + +.fa-wifi::before { + content: "\f1eb"; } + +.fa-wifi-3::before { + content: "\f1eb"; } + +.fa-wifi-strong::before { + content: "\f1eb"; } + +.fa-bath::before { + content: "\f2cd"; } + +.fa-bathtub::before { + content: "\f2cd"; } + +.fa-underline::before { + content: "\f0cd"; } + +.fa-user-pen::before { + content: "\f4ff"; } + +.fa-user-edit::before { + content: "\f4ff"; } + +.fa-signature::before { + content: "\f5b7"; } + +.fa-stroopwafel::before { + content: "\f551"; } + +.fa-bold::before { + content: "\f032"; } + +.fa-anchor-lock::before { + content: "\e4ad"; } + +.fa-building-ngo::before { + content: "\e4d7"; } + +.fa-manat-sign::before { + content: "\e1d5"; } + +.fa-not-equal::before { + content: "\f53e"; } + +.fa-border-top-left::before { + content: "\f853"; } + +.fa-border-style::before { + content: "\f853"; } + +.fa-map-location-dot::before { + content: "\f5a0"; } + +.fa-map-marked-alt::before { + content: "\f5a0"; } + +.fa-jedi::before { + content: "\f669"; } + +.fa-square-poll-vertical::before { + content: "\f681"; } + +.fa-poll::before { + content: "\f681"; } + +.fa-mug-hot::before { + content: "\f7b6"; } + +.fa-car-battery::before { + content: "\f5df"; } + +.fa-battery-car::before { + content: "\f5df"; } + +.fa-gift::before { + content: "\f06b"; } + +.fa-dice-two::before { + content: "\f528"; } + +.fa-chess-queen::before { + content: "\f445"; } + +.fa-glasses::before { + content: "\f530"; } + +.fa-chess-board::before { + content: "\f43c"; } + +.fa-building-circle-check::before { + content: "\e4d2"; } + +.fa-person-chalkboard::before { + content: "\e53d"; } + +.fa-mars-stroke-right::before { + content: "\f22b"; } + +.fa-mars-stroke-h::before { + content: "\f22b"; } + +.fa-hand-back-fist::before { + content: "\f255"; } + +.fa-hand-rock::before { + content: "\f255"; } + +.fa-square-caret-up::before { + content: "\f151"; } + +.fa-caret-square-up::before { + content: "\f151"; } + +.fa-cloud-showers-water::before { + content: "\e4e4"; } + +.fa-chart-bar::before { + content: "\f080"; } + +.fa-bar-chart::before { + content: "\f080"; } + +.fa-hands-bubbles::before { + content: "\e05e"; } + +.fa-hands-wash::before { + content: "\e05e"; } + +.fa-less-than-equal::before { + content: "\f537"; } + +.fa-train::before { + content: "\f238"; } + +.fa-eye-low-vision::before { + content: "\f2a8"; } + +.fa-low-vision::before { + content: "\f2a8"; } + +.fa-crow::before { + content: "\f520"; } + +.fa-sailboat::before { + content: "\e445"; } + +.fa-window-restore::before { + content: "\f2d2"; } + +.fa-square-plus::before { + content: "\f0fe"; } + +.fa-plus-square::before { + content: "\f0fe"; } + +.fa-torii-gate::before { + content: "\f6a1"; } + +.fa-frog::before { + content: "\f52e"; } + +.fa-bucket::before { + content: "\e4cf"; } + +.fa-image::before { + content: "\f03e"; } + +.fa-microphone::before { + content: "\f130"; } + +.fa-cow::before { + content: "\f6c8"; } + +.fa-caret-up::before { + content: "\f0d8"; } + +.fa-screwdriver::before { + content: "\f54a"; } + +.fa-folder-closed::before { + content: "\e185"; } + +.fa-house-tsunami::before { + content: "\e515"; } + +.fa-square-nfi::before { + content: "\e576"; } + +.fa-arrow-up-from-ground-water::before { + content: "\e4b5"; } + +.fa-martini-glass::before { + content: "\f57b"; } + +.fa-glass-martini-alt::before { + content: "\f57b"; } + +.fa-rotate-left::before { + content: "\f2ea"; } + +.fa-rotate-back::before { + content: "\f2ea"; } + +.fa-rotate-backward::before { + content: "\f2ea"; } + +.fa-undo-alt::before { + content: "\f2ea"; } + +.fa-table-columns::before { + content: "\f0db"; } + +.fa-columns::before { + content: "\f0db"; } + +.fa-lemon::before { + content: "\f094"; } + +.fa-head-side-mask::before { + content: "\e063"; } + +.fa-handshake::before { + content: "\f2b5"; } + +.fa-gem::before { + content: "\f3a5"; } + +.fa-dolly::before { + content: "\f472"; } + +.fa-dolly-box::before { + content: "\f472"; } + +.fa-smoking::before { + content: "\f48d"; } + +.fa-minimize::before { + content: "\f78c"; } + +.fa-compress-arrows-alt::before { + content: "\f78c"; } + +.fa-monument::before { + content: "\f5a6"; } + +.fa-snowplow::before { + content: "\f7d2"; } + +.fa-angles-right::before { + content: "\f101"; } + +.fa-angle-double-right::before { + content: "\f101"; } + +.fa-cannabis::before { + content: "\f55f"; } + +.fa-circle-play::before { + content: "\f144"; } + +.fa-play-circle::before { + content: "\f144"; } + +.fa-tablets::before { + content: "\f490"; } + +.fa-ethernet::before { + content: "\f796"; } + +.fa-euro-sign::before { + content: "\f153"; } + +.fa-eur::before { + content: "\f153"; } + +.fa-euro::before { + content: "\f153"; } + +.fa-chair::before { + content: "\f6c0"; } + +.fa-circle-check::before { + content: "\f058"; } + +.fa-check-circle::before { + content: "\f058"; } + +.fa-circle-stop::before { + content: "\f28d"; } + +.fa-stop-circle::before { + content: "\f28d"; } + +.fa-compass-drafting::before { + content: "\f568"; } + +.fa-drafting-compass::before { + content: "\f568"; } + +.fa-plate-wheat::before { + content: "\e55a"; } + +.fa-icicles::before { + content: "\f7ad"; } + +.fa-person-shelter::before { + content: "\e54f"; } + +.fa-neuter::before { + content: "\f22c"; } + +.fa-id-badge::before { + content: "\f2c1"; } + +.fa-marker::before { + content: "\f5a1"; } + +.fa-face-laugh-beam::before { + content: "\f59a"; } + +.fa-laugh-beam::before { + content: "\f59a"; } + +.fa-helicopter-symbol::before { + content: "\e502"; } + +.fa-universal-access::before { + content: "\f29a"; } + +.fa-circle-chevron-up::before { + content: "\f139"; } + +.fa-chevron-circle-up::before { + content: "\f139"; } + +.fa-lari-sign::before { + content: "\e1c8"; } + +.fa-volcano::before { + content: "\f770"; } + +.fa-person-walking-dashed-line-arrow-right::before { + content: "\e553"; } + +.fa-sterling-sign::before { + content: "\f154"; } + +.fa-gbp::before { + content: "\f154"; } + +.fa-pound-sign::before { + content: "\f154"; } + +.fa-viruses::before { + content: "\e076"; } + +.fa-square-person-confined::before { + content: "\e577"; } + +.fa-user-tie::before { + content: "\f508"; } + +.fa-arrow-down-long::before { + content: "\f175"; } + +.fa-long-arrow-down::before { + content: "\f175"; } + +.fa-tent-arrow-down-to-line::before { + content: "\e57e"; } + +.fa-certificate::before { + content: "\f0a3"; } + +.fa-reply-all::before { + content: "\f122"; } + +.fa-mail-reply-all::before { + content: "\f122"; } + +.fa-suitcase::before { + content: "\f0f2"; } + +.fa-person-skating::before { + content: "\f7c5"; } + +.fa-skating::before { + content: "\f7c5"; } + +.fa-filter-circle-dollar::before { + content: "\f662"; } + +.fa-funnel-dollar::before { + content: "\f662"; } + +.fa-camera-retro::before { + content: "\f083"; } + +.fa-circle-arrow-down::before { + content: "\f0ab"; } + +.fa-arrow-circle-down::before { + content: "\f0ab"; } + +.fa-file-import::before { + content: "\f56f"; } + +.fa-arrow-right-to-file::before { + content: "\f56f"; } + +.fa-square-arrow-up-right::before { + content: "\f14c"; } + +.fa-external-link-square::before { + content: "\f14c"; } + +.fa-box-open::before { + content: "\f49e"; } + +.fa-scroll::before { + content: "\f70e"; } + +.fa-spa::before { + content: "\f5bb"; } + +.fa-location-pin-lock::before { + content: "\e51f"; } + +.fa-pause::before { + content: "\f04c"; } + +.fa-hill-avalanche::before { + content: "\e507"; } + +.fa-temperature-empty::before { + content: "\f2cb"; } + +.fa-temperature-0::before { + content: "\f2cb"; } + +.fa-thermometer-0::before { + content: "\f2cb"; } + +.fa-thermometer-empty::before { + content: "\f2cb"; } + +.fa-bomb::before { + content: "\f1e2"; } + +.fa-registered::before { + content: "\f25d"; } + +.fa-address-card::before { + content: "\f2bb"; } + +.fa-contact-card::before { + content: "\f2bb"; } + +.fa-vcard::before { + content: "\f2bb"; } + +.fa-scale-unbalanced-flip::before { + content: "\f516"; } + +.fa-balance-scale-right::before { + content: "\f516"; } + +.fa-subscript::before { + content: "\f12c"; } + +.fa-diamond-turn-right::before { + content: "\f5eb"; } + +.fa-directions::before { + content: "\f5eb"; } + +.fa-burst::before { + content: "\e4dc"; } + +.fa-house-laptop::before { + content: "\e066"; } + +.fa-laptop-house::before { + content: "\e066"; } + +.fa-face-tired::before { + content: "\f5c8"; } + +.fa-tired::before { + content: "\f5c8"; } + +.fa-money-bills::before { + content: "\e1f3"; } + +.fa-smog::before { + content: "\f75f"; } + +.fa-crutch::before { + content: "\f7f7"; } + +.fa-cloud-arrow-up::before { + content: "\f0ee"; } + +.fa-cloud-upload::before { + content: "\f0ee"; } + +.fa-cloud-upload-alt::before { + content: "\f0ee"; } + +.fa-palette::before { + content: "\f53f"; } + +.fa-arrows-turn-right::before { + content: "\e4c0"; } + +.fa-vest::before { + content: "\e085"; } + +.fa-ferry::before { + content: "\e4ea"; } + +.fa-arrows-down-to-people::before { + content: "\e4b9"; } + +.fa-seedling::before { + content: "\f4d8"; } + +.fa-sprout::before { + content: "\f4d8"; } + +.fa-left-right::before { + content: "\f337"; } + +.fa-arrows-alt-h::before { + content: "\f337"; } + +.fa-boxes-packing::before { + content: "\e4c7"; } + +.fa-circle-arrow-left::before { + content: "\f0a8"; } + +.fa-arrow-circle-left::before { + content: "\f0a8"; } + +.fa-group-arrows-rotate::before { + content: "\e4f6"; } + +.fa-bowl-food::before { + content: "\e4c6"; } + +.fa-candy-cane::before { + content: "\f786"; } + +.fa-arrow-down-wide-short::before { + content: "\f160"; } + +.fa-sort-amount-asc::before { + content: "\f160"; } + +.fa-sort-amount-down::before { + content: "\f160"; } + +.fa-cloud-bolt::before { + content: "\f76c"; } + +.fa-thunderstorm::before { + content: "\f76c"; } + +.fa-text-slash::before { + content: "\f87d"; } + +.fa-remove-format::before { + content: "\f87d"; } + +.fa-face-smile-wink::before { + content: "\f4da"; } + +.fa-smile-wink::before { + content: "\f4da"; } + +.fa-file-word::before { + content: "\f1c2"; } + +.fa-file-powerpoint::before { + content: "\f1c4"; } + +.fa-arrows-left-right::before { + content: "\f07e"; } + +.fa-arrows-h::before { + content: "\f07e"; } + +.fa-house-lock::before { + content: "\e510"; } + +.fa-cloud-arrow-down::before { + content: "\f0ed"; } + +.fa-cloud-download::before { + content: "\f0ed"; } + +.fa-cloud-download-alt::before { + content: "\f0ed"; } + +.fa-children::before { + content: "\e4e1"; } + +.fa-chalkboard::before { + content: "\f51b"; } + +.fa-blackboard::before { + content: "\f51b"; } + +.fa-user-large-slash::before { + content: "\f4fa"; } + +.fa-user-alt-slash::before { + content: "\f4fa"; } + +.fa-envelope-open::before { + content: "\f2b6"; } + +.fa-handshake-simple-slash::before { + content: "\e05f"; } + +.fa-handshake-alt-slash::before { + content: "\e05f"; } + +.fa-mattress-pillow::before { + content: "\e525"; } + +.fa-guarani-sign::before { + content: "\e19a"; } + +.fa-arrows-rotate::before { + content: "\f021"; } + +.fa-refresh::before { + content: "\f021"; } + +.fa-sync::before { + content: "\f021"; } + +.fa-fire-extinguisher::before { + content: "\f134"; } + +.fa-cruzeiro-sign::before { + content: "\e152"; } + +.fa-greater-than-equal::before { + content: "\f532"; } + +.fa-shield-halved::before { + content: "\f3ed"; } + +.fa-shield-alt::before { + content: "\f3ed"; } + +.fa-book-atlas::before { + content: "\f558"; } + +.fa-atlas::before { + content: "\f558"; } + +.fa-virus::before { + content: "\e074"; } + +.fa-envelope-circle-check::before { + content: "\e4e8"; } + +.fa-layer-group::before { + content: "\f5fd"; } + +.fa-arrows-to-dot::before { + content: "\e4be"; } + +.fa-archway::before { + content: "\f557"; } + +.fa-heart-circle-check::before { + content: "\e4fd"; } + +.fa-house-chimney-crack::before { + content: "\f6f1"; } + +.fa-house-damage::before { + content: "\f6f1"; } + +.fa-file-zipper::before { + content: "\f1c6"; } + +.fa-file-archive::before { + content: "\f1c6"; } + +.fa-square::before { + content: "\f0c8"; } + +.fa-martini-glass-empty::before { + content: "\f000"; } + +.fa-glass-martini::before { + content: "\f000"; } + +.fa-couch::before { + content: "\f4b8"; } + +.fa-cedi-sign::before { + content: "\e0df"; } + +.fa-italic::before { + content: "\f033"; } + +.fa-table-cells-column-lock::before { + content: "\e678"; } + +.fa-church::before { + content: "\f51d"; } + +.fa-comments-dollar::before { + content: "\f653"; } + +.fa-democrat::before { + content: "\f747"; } + +.fa-z::before { + content: "\5a"; } + +.fa-person-skiing::before { + content: "\f7c9"; } + +.fa-skiing::before { + content: "\f7c9"; } + +.fa-road-lock::before { + content: "\e567"; } + +.fa-a::before { + content: "\41"; } + +.fa-temperature-arrow-down::before { + content: "\e03f"; } + +.fa-temperature-down::before { + content: "\e03f"; } + +.fa-feather-pointed::before { + content: "\f56b"; } + +.fa-feather-alt::before { + content: "\f56b"; } + +.fa-p::before { + content: "\50"; } + +.fa-snowflake::before { + content: "\f2dc"; } + +.fa-newspaper::before { + content: "\f1ea"; } + +.fa-rectangle-ad::before { + content: "\f641"; } + +.fa-ad::before { + content: "\f641"; } + +.fa-circle-arrow-right::before { + content: "\f0a9"; } + +.fa-arrow-circle-right::before { + content: "\f0a9"; } + +.fa-filter-circle-xmark::before { + content: "\e17b"; } + +.fa-locust::before { + content: "\e520"; } + +.fa-sort::before { + content: "\f0dc"; } + +.fa-unsorted::before { + content: "\f0dc"; } + +.fa-list-ol::before { + content: "\f0cb"; } + +.fa-list-1-2::before { + content: "\f0cb"; } + +.fa-list-numeric::before { + content: "\f0cb"; } + +.fa-person-dress-burst::before { + content: "\e544"; } + +.fa-money-check-dollar::before { + content: "\f53d"; } + +.fa-money-check-alt::before { + content: "\f53d"; } + +.fa-vector-square::before { + content: "\f5cb"; } + +.fa-bread-slice::before { + content: "\f7ec"; } + +.fa-language::before { + content: "\f1ab"; } + +.fa-face-kiss-wink-heart::before { + content: "\f598"; } + +.fa-kiss-wink-heart::before { + content: "\f598"; } + +.fa-filter::before { + content: "\f0b0"; } + +.fa-question::before { + content: "\3f"; } + +.fa-file-signature::before { + content: "\f573"; } + +.fa-up-down-left-right::before { + content: "\f0b2"; } + +.fa-arrows-alt::before { + content: "\f0b2"; } + +.fa-house-chimney-user::before { + content: "\e065"; } + +.fa-hand-holding-heart::before { + content: "\f4be"; } + +.fa-puzzle-piece::before { + content: "\f12e"; } + +.fa-money-check::before { + content: "\f53c"; } + +.fa-star-half-stroke::before { + content: "\f5c0"; } + +.fa-star-half-alt::before { + content: "\f5c0"; } + +.fa-code::before { + content: "\f121"; } + +.fa-whiskey-glass::before { + content: "\f7a0"; } + +.fa-glass-whiskey::before { + content: "\f7a0"; } + +.fa-building-circle-exclamation::before { + content: "\e4d3"; } + +.fa-magnifying-glass-chart::before { + content: "\e522"; } + +.fa-arrow-up-right-from-square::before { + content: "\f08e"; } + +.fa-external-link::before { + content: "\f08e"; } + +.fa-cubes-stacked::before { + content: "\e4e6"; } + +.fa-won-sign::before { + content: "\f159"; } + +.fa-krw::before { + content: "\f159"; } + +.fa-won::before { + content: "\f159"; } + +.fa-virus-covid::before { + content: "\e4a8"; } + +.fa-austral-sign::before { + content: "\e0a9"; } + +.fa-f::before { + content: "\46"; } + +.fa-leaf::before { + content: "\f06c"; } + +.fa-road::before { + content: "\f018"; } + +.fa-taxi::before { + content: "\f1ba"; } + +.fa-cab::before { + content: "\f1ba"; } + +.fa-person-circle-plus::before { + content: "\e541"; } + +.fa-chart-pie::before { + content: "\f200"; } + +.fa-pie-chart::before { + content: "\f200"; } + +.fa-bolt-lightning::before { + content: "\e0b7"; } + +.fa-sack-xmark::before { + content: "\e56a"; } + +.fa-file-excel::before { + content: "\f1c3"; } + +.fa-file-contract::before { + content: "\f56c"; } + +.fa-fish-fins::before { + content: "\e4f2"; } + +.fa-building-flag::before { + content: "\e4d5"; } + +.fa-face-grin-beam::before { + content: "\f582"; } + +.fa-grin-beam::before { + content: "\f582"; } + +.fa-object-ungroup::before { + content: "\f248"; } + +.fa-poop::before { + content: "\f619"; } + +.fa-location-pin::before { + content: "\f041"; } + +.fa-map-marker::before { + content: "\f041"; } + +.fa-kaaba::before { + content: "\f66b"; } + +.fa-toilet-paper::before { + content: "\f71e"; } + +.fa-helmet-safety::before { + content: "\f807"; } + +.fa-hard-hat::before { + content: "\f807"; } + +.fa-hat-hard::before { + content: "\f807"; } + +.fa-eject::before { + content: "\f052"; } + +.fa-circle-right::before { + content: "\f35a"; } + +.fa-arrow-alt-circle-right::before { + content: "\f35a"; } + +.fa-plane-circle-check::before { + content: "\e555"; } + +.fa-face-rolling-eyes::before { + content: "\f5a5"; } + +.fa-meh-rolling-eyes::before { + content: "\f5a5"; } + +.fa-object-group::before { + content: "\f247"; } + +.fa-chart-line::before { + content: "\f201"; } + +.fa-line-chart::before { + content: "\f201"; } + +.fa-mask-ventilator::before { + content: "\e524"; } + +.fa-arrow-right::before { + content: "\f061"; } + +.fa-signs-post::before { + content: "\f277"; } + +.fa-map-signs::before { + content: "\f277"; } + +.fa-cash-register::before { + content: "\f788"; } + +.fa-person-circle-question::before { + content: "\e542"; } + +.fa-h::before { + content: "\48"; } + +.fa-tarp::before { + content: "\e57b"; } + +.fa-screwdriver-wrench::before { + content: "\f7d9"; } + +.fa-tools::before { + content: "\f7d9"; } + +.fa-arrows-to-eye::before { + content: "\e4bf"; } + +.fa-plug-circle-bolt::before { + content: "\e55b"; } + +.fa-heart::before { + content: "\f004"; } + +.fa-mars-and-venus::before { + content: "\f224"; } + +.fa-house-user::before { + content: "\e1b0"; } + +.fa-home-user::before { + content: "\e1b0"; } + +.fa-dumpster-fire::before { + content: "\f794"; } + +.fa-house-crack::before { + content: "\e3b1"; } + +.fa-martini-glass-citrus::before { + content: "\f561"; } + +.fa-cocktail::before { + content: "\f561"; } + +.fa-face-surprise::before { + content: "\f5c2"; } + +.fa-surprise::before { + content: "\f5c2"; } + +.fa-bottle-water::before { + content: "\e4c5"; } + +.fa-circle-pause::before { + content: "\f28b"; } + +.fa-pause-circle::before { + content: "\f28b"; } + +.fa-toilet-paper-slash::before { + content: "\e072"; } + +.fa-apple-whole::before { + content: "\f5d1"; } + +.fa-apple-alt::before { + content: "\f5d1"; } + +.fa-kitchen-set::before { + content: "\e51a"; } + +.fa-r::before { + content: "\52"; } + +.fa-temperature-quarter::before { + content: "\f2ca"; } + +.fa-temperature-1::before { + content: "\f2ca"; } + +.fa-thermometer-1::before { + content: "\f2ca"; } + +.fa-thermometer-quarter::before { + content: "\f2ca"; } + +.fa-cube::before { + content: "\f1b2"; } + +.fa-bitcoin-sign::before { + content: "\e0b4"; } + +.fa-shield-dog::before { + content: "\e573"; } + +.fa-solar-panel::before { + content: "\f5ba"; } + +.fa-lock-open::before { + content: "\f3c1"; } + +.fa-elevator::before { + content: "\e16d"; } + +.fa-money-bill-transfer::before { + content: "\e528"; } + +.fa-money-bill-trend-up::before { + content: "\e529"; } + +.fa-house-flood-water-circle-arrow-right::before { + content: "\e50f"; } + +.fa-square-poll-horizontal::before { + content: "\f682"; } + +.fa-poll-h::before { + content: "\f682"; } + +.fa-circle::before { + content: "\f111"; } + +.fa-backward-fast::before { + content: "\f049"; } + +.fa-fast-backward::before { + content: "\f049"; } + +.fa-recycle::before { + content: "\f1b8"; } + +.fa-user-astronaut::before { + content: "\f4fb"; } + +.fa-plane-slash::before { + content: "\e069"; } + +.fa-trademark::before { + content: "\f25c"; } + +.fa-basketball::before { + content: "\f434"; } + +.fa-basketball-ball::before { + content: "\f434"; } + +.fa-satellite-dish::before { + content: "\f7c0"; } + +.fa-circle-up::before { + content: "\f35b"; } + +.fa-arrow-alt-circle-up::before { + content: "\f35b"; } + +.fa-mobile-screen-button::before { + content: "\f3cd"; } + +.fa-mobile-alt::before { + content: "\f3cd"; } + +.fa-volume-high::before { + content: "\f028"; } + +.fa-volume-up::before { + content: "\f028"; } + +.fa-users-rays::before { + content: "\e593"; } + +.fa-wallet::before { + content: "\f555"; } + +.fa-clipboard-check::before { + content: "\f46c"; } + +.fa-file-audio::before { + content: "\f1c7"; } + +.fa-burger::before { + content: "\f805"; } + +.fa-hamburger::before { + content: "\f805"; } + +.fa-wrench::before { + content: "\f0ad"; } + +.fa-bugs::before { + content: "\e4d0"; } + +.fa-rupee-sign::before { + content: "\f156"; } + +.fa-rupee::before { + content: "\f156"; } + +.fa-file-image::before { + content: "\f1c5"; } + +.fa-circle-question::before { + content: "\f059"; } + +.fa-question-circle::before { + content: "\f059"; } + +.fa-plane-departure::before { + content: "\f5b0"; } + +.fa-handshake-slash::before { + content: "\e060"; } + +.fa-book-bookmark::before { + content: "\e0bb"; } + +.fa-code-branch::before { + content: "\f126"; } + +.fa-hat-cowboy::before { + content: "\f8c0"; } + +.fa-bridge::before { + content: "\e4c8"; } + +.fa-phone-flip::before { + content: "\f879"; } + +.fa-phone-alt::before { + content: "\f879"; } + +.fa-truck-front::before { + content: "\e2b7"; } + +.fa-cat::before { + content: "\f6be"; } + +.fa-anchor-circle-exclamation::before { + content: "\e4ab"; } + +.fa-truck-field::before { + content: "\e58d"; } + +.fa-route::before { + content: "\f4d7"; } + +.fa-clipboard-question::before { + content: "\e4e3"; } + +.fa-panorama::before { + content: "\e209"; } + +.fa-comment-medical::before { + content: "\f7f5"; } + +.fa-teeth-open::before { + content: "\f62f"; } + +.fa-file-circle-minus::before { + content: "\e4ed"; } + +.fa-tags::before { + content: "\f02c"; } + +.fa-wine-glass::before { + content: "\f4e3"; } + +.fa-forward-fast::before { + content: "\f050"; } + +.fa-fast-forward::before { + content: "\f050"; } + +.fa-face-meh-blank::before { + content: "\f5a4"; } + +.fa-meh-blank::before { + content: "\f5a4"; } + +.fa-square-parking::before { + content: "\f540"; } + +.fa-parking::before { + content: "\f540"; } + +.fa-house-signal::before { + content: "\e012"; } + +.fa-bars-progress::before { + content: "\f828"; } + +.fa-tasks-alt::before { + content: "\f828"; } + +.fa-faucet-drip::before { + content: "\e006"; } + +.fa-cart-flatbed::before { + content: "\f474"; } + +.fa-dolly-flatbed::before { + content: "\f474"; } + +.fa-ban-smoking::before { + content: "\f54d"; } + +.fa-smoking-ban::before { + content: "\f54d"; } + +.fa-terminal::before { + content: "\f120"; } + +.fa-mobile-button::before { + content: "\f10b"; } + +.fa-house-medical-flag::before { + content: "\e514"; } + +.fa-basket-shopping::before { + content: "\f291"; } + +.fa-shopping-basket::before { + content: "\f291"; } + +.fa-tape::before { + content: "\f4db"; } + +.fa-bus-simple::before { + content: "\f55e"; } + +.fa-bus-alt::before { + content: "\f55e"; } + +.fa-eye::before { + content: "\f06e"; } + +.fa-face-sad-cry::before { + content: "\f5b3"; } + +.fa-sad-cry::before { + content: "\f5b3"; } + +.fa-audio-description::before { + content: "\f29e"; } + +.fa-person-military-to-person::before { + content: "\e54c"; } + +.fa-file-shield::before { + content: "\e4f0"; } + +.fa-user-slash::before { + content: "\f506"; } + +.fa-pen::before { + content: "\f304"; } + +.fa-tower-observation::before { + content: "\e586"; } + +.fa-file-code::before { + content: "\f1c9"; } + +.fa-signal::before { + content: "\f012"; } + +.fa-signal-5::before { + content: "\f012"; } + +.fa-signal-perfect::before { + content: "\f012"; } + +.fa-bus::before { + content: "\f207"; } + +.fa-heart-circle-xmark::before { + content: "\e501"; } + +.fa-house-chimney::before { + content: "\e3af"; } + +.fa-home-lg::before { + content: "\e3af"; } + +.fa-window-maximize::before { + content: "\f2d0"; } + +.fa-face-frown::before { + content: "\f119"; } + +.fa-frown::before { + content: "\f119"; } + +.fa-prescription::before { + content: "\f5b1"; } + +.fa-shop::before { + content: "\f54f"; } + +.fa-store-alt::before { + content: "\f54f"; } + +.fa-floppy-disk::before { + content: "\f0c7"; } + +.fa-save::before { + content: "\f0c7"; } + +.fa-vihara::before { + content: "\f6a7"; } + +.fa-scale-unbalanced::before { + content: "\f515"; } + +.fa-balance-scale-left::before { + content: "\f515"; } + +.fa-sort-up::before { + content: "\f0de"; } + +.fa-sort-asc::before { + content: "\f0de"; } + +.fa-comment-dots::before { + content: "\f4ad"; } + +.fa-commenting::before { + content: "\f4ad"; } + +.fa-plant-wilt::before { + content: "\e5aa"; } + +.fa-diamond::before { + content: "\f219"; } + +.fa-face-grin-squint::before { + content: "\f585"; } + +.fa-grin-squint::before { + content: "\f585"; } + +.fa-hand-holding-dollar::before { + content: "\f4c0"; } + +.fa-hand-holding-usd::before { + content: "\f4c0"; } + +.fa-bacterium::before { + content: "\e05a"; } + +.fa-hand-pointer::before { + content: "\f25a"; } + +.fa-drum-steelpan::before { + content: "\f56a"; } + +.fa-hand-scissors::before { + content: "\f257"; } + +.fa-hands-praying::before { + content: "\f684"; } + +.fa-praying-hands::before { + content: "\f684"; } + +.fa-arrow-rotate-right::before { + content: "\f01e"; } + +.fa-arrow-right-rotate::before { + content: "\f01e"; } + +.fa-arrow-rotate-forward::before { + content: "\f01e"; } + +.fa-redo::before { + content: "\f01e"; } + +.fa-biohazard::before { + content: "\f780"; } + +.fa-location-crosshairs::before { + content: "\f601"; } + +.fa-location::before { + content: "\f601"; } + +.fa-mars-double::before { + content: "\f227"; } + +.fa-child-dress::before { + content: "\e59c"; } + +.fa-users-between-lines::before { + content: "\e591"; } + +.fa-lungs-virus::before { + content: "\e067"; } + +.fa-face-grin-tears::before { + content: "\f588"; } + +.fa-grin-tears::before { + content: "\f588"; } + +.fa-phone::before { + content: "\f095"; } + +.fa-calendar-xmark::before { + content: "\f273"; } + +.fa-calendar-times::before { + content: "\f273"; } + +.fa-child-reaching::before { + content: "\e59d"; } + +.fa-head-side-virus::before { + content: "\e064"; } + +.fa-user-gear::before { + content: "\f4fe"; } + +.fa-user-cog::before { + content: "\f4fe"; } + +.fa-arrow-up-1-9::before { + content: "\f163"; } + +.fa-sort-numeric-up::before { + content: "\f163"; } + +.fa-door-closed::before { + content: "\f52a"; } + +.fa-shield-virus::before { + content: "\e06c"; } + +.fa-dice-six::before { + content: "\f526"; } + +.fa-mosquito-net::before { + content: "\e52c"; } + +.fa-bridge-water::before { + content: "\e4ce"; } + +.fa-person-booth::before { + content: "\f756"; } + +.fa-text-width::before { + content: "\f035"; } + +.fa-hat-wizard::before { + content: "\f6e8"; } + +.fa-pen-fancy::before { + content: "\f5ac"; } + +.fa-person-digging::before { + content: "\f85e"; } + +.fa-digging::before { + content: "\f85e"; } + +.fa-trash::before { + content: "\f1f8"; } + +.fa-gauge-simple::before { + content: "\f629"; } + +.fa-gauge-simple-med::before { + content: "\f629"; } + +.fa-tachometer-average::before { + content: "\f629"; } + +.fa-book-medical::before { + content: "\f7e6"; } + +.fa-poo::before { + content: "\f2fe"; } + +.fa-quote-right::before { + content: "\f10e"; } + +.fa-quote-right-alt::before { + content: "\f10e"; } + +.fa-shirt::before { + content: "\f553"; } + +.fa-t-shirt::before { + content: "\f553"; } + +.fa-tshirt::before { + content: "\f553"; } + +.fa-cubes::before { + content: "\f1b3"; } + +.fa-divide::before { + content: "\f529"; } + +.fa-tenge-sign::before { + content: "\f7d7"; } + +.fa-tenge::before { + content: "\f7d7"; } + +.fa-headphones::before { + content: "\f025"; } + +.fa-hands-holding::before { + content: "\f4c2"; } + +.fa-hands-clapping::before { + content: "\e1a8"; } + +.fa-republican::before { + content: "\f75e"; } + +.fa-arrow-left::before { + content: "\f060"; } + +.fa-person-circle-xmark::before { + content: "\e543"; } + +.fa-ruler::before { + content: "\f545"; } + +.fa-align-left::before { + content: "\f036"; } + +.fa-dice-d6::before { + content: "\f6d1"; } + +.fa-restroom::before { + content: "\f7bd"; } + +.fa-j::before { + content: "\4a"; } + +.fa-users-viewfinder::before { + content: "\e595"; } + +.fa-file-video::before { + content: "\f1c8"; } + +.fa-up-right-from-square::before { + content: "\f35d"; } + +.fa-external-link-alt::before { + content: "\f35d"; } + +.fa-table-cells::before { + content: "\f00a"; } + +.fa-th::before { + content: "\f00a"; } + +.fa-file-pdf::before { + content: "\f1c1"; } + +.fa-book-bible::before { + content: "\f647"; } + +.fa-bible::before { + content: "\f647"; } + +.fa-o::before { + content: "\4f"; } + +.fa-suitcase-medical::before { + content: "\f0fa"; } + +.fa-medkit::before { + content: "\f0fa"; } + +.fa-user-secret::before { + content: "\f21b"; } + +.fa-otter::before { + content: "\f700"; } + +.fa-person-dress::before { + content: "\f182"; } + +.fa-female::before { + content: "\f182"; } + +.fa-comment-dollar::before { + content: "\f651"; } + +.fa-business-time::before { + content: "\f64a"; } + +.fa-briefcase-clock::before { + content: "\f64a"; } + +.fa-table-cells-large::before { + content: "\f009"; } + +.fa-th-large::before { + content: "\f009"; } + +.fa-book-tanakh::before { + content: "\f827"; } + +.fa-tanakh::before { + content: "\f827"; } + +.fa-phone-volume::before { + content: "\f2a0"; } + +.fa-volume-control-phone::before { + content: "\f2a0"; } + +.fa-hat-cowboy-side::before { + content: "\f8c1"; } + +.fa-clipboard-user::before { + content: "\f7f3"; } + +.fa-child::before { + content: "\f1ae"; } + +.fa-lira-sign::before { + content: "\f195"; } + +.fa-satellite::before { + content: "\f7bf"; } + +.fa-plane-lock::before { + content: "\e558"; } + +.fa-tag::before { + content: "\f02b"; } + +.fa-comment::before { + content: "\f075"; } + +.fa-cake-candles::before { + content: "\f1fd"; } + +.fa-birthday-cake::before { + content: "\f1fd"; } + +.fa-cake::before { + content: "\f1fd"; } + +.fa-envelope::before { + content: "\f0e0"; } + +.fa-angles-up::before { + content: "\f102"; } + +.fa-angle-double-up::before { + content: "\f102"; } + +.fa-paperclip::before { + content: "\f0c6"; } + +.fa-arrow-right-to-city::before { + content: "\e4b3"; } + +.fa-ribbon::before { + content: "\f4d6"; } + +.fa-lungs::before { + content: "\f604"; } + +.fa-arrow-up-9-1::before { + content: "\f887"; } + +.fa-sort-numeric-up-alt::before { + content: "\f887"; } + +.fa-litecoin-sign::before { + content: "\e1d3"; } + +.fa-border-none::before { + content: "\f850"; } + +.fa-circle-nodes::before { + content: "\e4e2"; } + +.fa-parachute-box::before { + content: "\f4cd"; } + +.fa-indent::before { + content: "\f03c"; } + +.fa-truck-field-un::before { + content: "\e58e"; } + +.fa-hourglass::before { + content: "\f254"; } + +.fa-hourglass-empty::before { + content: "\f254"; } + +.fa-mountain::before { + content: "\f6fc"; } + +.fa-user-doctor::before { + content: "\f0f0"; } + +.fa-user-md::before { + content: "\f0f0"; } + +.fa-circle-info::before { + content: "\f05a"; } + +.fa-info-circle::before { + content: "\f05a"; } + +.fa-cloud-meatball::before { + content: "\f73b"; } + +.fa-camera::before { + content: "\f030"; } + +.fa-camera-alt::before { + content: "\f030"; } + +.fa-square-virus::before { + content: "\e578"; } + +.fa-meteor::before { + content: "\f753"; } + +.fa-car-on::before { + content: "\e4dd"; } + +.fa-sleigh::before { + content: "\f7cc"; } + +.fa-arrow-down-1-9::before { + content: "\f162"; } + +.fa-sort-numeric-asc::before { + content: "\f162"; } + +.fa-sort-numeric-down::before { + content: "\f162"; } + +.fa-hand-holding-droplet::before { + content: "\f4c1"; } + +.fa-hand-holding-water::before { + content: "\f4c1"; } + +.fa-water::before { + content: "\f773"; } + +.fa-calendar-check::before { + content: "\f274"; } + +.fa-braille::before { + content: "\f2a1"; } + +.fa-prescription-bottle-medical::before { + content: "\f486"; } + +.fa-prescription-bottle-alt::before { + content: "\f486"; } + +.fa-landmark::before { + content: "\f66f"; } + +.fa-truck::before { + content: "\f0d1"; } + +.fa-crosshairs::before { + content: "\f05b"; } + +.fa-person-cane::before { + content: "\e53c"; } + +.fa-tent::before { + content: "\e57d"; } + +.fa-vest-patches::before { + content: "\e086"; } + +.fa-check-double::before { + content: "\f560"; } + +.fa-arrow-down-a-z::before { + content: "\f15d"; } + +.fa-sort-alpha-asc::before { + content: "\f15d"; } + +.fa-sort-alpha-down::before { + content: "\f15d"; } + +.fa-money-bill-wheat::before { + content: "\e52a"; } + +.fa-cookie::before { + content: "\f563"; } + +.fa-arrow-rotate-left::before { + content: "\f0e2"; } + +.fa-arrow-left-rotate::before { + content: "\f0e2"; } + +.fa-arrow-rotate-back::before { + content: "\f0e2"; } + +.fa-arrow-rotate-backward::before { + content: "\f0e2"; } + +.fa-undo::before { + content: "\f0e2"; } + +.fa-hard-drive::before { + content: "\f0a0"; } + +.fa-hdd::before { + content: "\f0a0"; } + +.fa-face-grin-squint-tears::before { + content: "\f586"; } + +.fa-grin-squint-tears::before { + content: "\f586"; } + +.fa-dumbbell::before { + content: "\f44b"; } + +.fa-rectangle-list::before { + content: "\f022"; } + +.fa-list-alt::before { + content: "\f022"; } + +.fa-tarp-droplet::before { + content: "\e57c"; } + +.fa-house-medical-circle-check::before { + content: "\e511"; } + +.fa-person-skiing-nordic::before { + content: "\f7ca"; } + +.fa-skiing-nordic::before { + content: "\f7ca"; } + +.fa-calendar-plus::before { + content: "\f271"; } + +.fa-plane-arrival::before { + content: "\f5af"; } + +.fa-circle-left::before { + content: "\f359"; } + +.fa-arrow-alt-circle-left::before { + content: "\f359"; } + +.fa-train-subway::before { + content: "\f239"; } + +.fa-subway::before { + content: "\f239"; } + +.fa-chart-gantt::before { + content: "\e0e4"; } + +.fa-indian-rupee-sign::before { + content: "\e1bc"; } + +.fa-indian-rupee::before { + content: "\e1bc"; } + +.fa-inr::before { + content: "\e1bc"; } + +.fa-crop-simple::before { + content: "\f565"; } + +.fa-crop-alt::before { + content: "\f565"; } + +.fa-money-bill-1::before { + content: "\f3d1"; } + +.fa-money-bill-alt::before { + content: "\f3d1"; } + +.fa-left-long::before { + content: "\f30a"; } + +.fa-long-arrow-alt-left::before { + content: "\f30a"; } + +.fa-dna::before { + content: "\f471"; } + +.fa-virus-slash::before { + content: "\e075"; } + +.fa-minus::before { + content: "\f068"; } + +.fa-subtract::before { + content: "\f068"; } + +.fa-chess::before { + content: "\f439"; } + +.fa-arrow-left-long::before { + content: "\f177"; } + +.fa-long-arrow-left::before { + content: "\f177"; } + +.fa-plug-circle-check::before { + content: "\e55c"; } + +.fa-street-view::before { + content: "\f21d"; } + +.fa-franc-sign::before { + content: "\e18f"; } + +.fa-volume-off::before { + content: "\f026"; } + +.fa-hands-asl-interpreting::before { + content: "\f2a3"; } + +.fa-american-sign-language-interpreting::before { + content: "\f2a3"; } + +.fa-asl-interpreting::before { + content: "\f2a3"; } + +.fa-hands-american-sign-language-interpreting::before { + content: "\f2a3"; } + +.fa-gear::before { + content: "\f013"; } + +.fa-cog::before { + content: "\f013"; } + +.fa-droplet-slash::before { + content: "\f5c7"; } + +.fa-tint-slash::before { + content: "\f5c7"; } + +.fa-mosque::before { + content: "\f678"; } + +.fa-mosquito::before { + content: "\e52b"; } + +.fa-star-of-david::before { + content: "\f69a"; } + +.fa-person-military-rifle::before { + content: "\e54b"; } + +.fa-cart-shopping::before { + content: "\f07a"; } + +.fa-shopping-cart::before { + content: "\f07a"; } + +.fa-vials::before { + content: "\f493"; } + +.fa-plug-circle-plus::before { + content: "\e55f"; } + +.fa-place-of-worship::before { + content: "\f67f"; } + +.fa-grip-vertical::before { + content: "\f58e"; } + +.fa-arrow-turn-up::before { + content: "\f148"; } + +.fa-level-up::before { + content: "\f148"; } + +.fa-u::before { + content: "\55"; } + +.fa-square-root-variable::before { + content: "\f698"; } + +.fa-square-root-alt::before { + content: "\f698"; } + +.fa-clock::before { + content: "\f017"; } + +.fa-clock-four::before { + content: "\f017"; } + +.fa-backward-step::before { + content: "\f048"; } + +.fa-step-backward::before { + content: "\f048"; } + +.fa-pallet::before { + content: "\f482"; } + +.fa-faucet::before { + content: "\e005"; } + +.fa-baseball-bat-ball::before { + content: "\f432"; } + +.fa-s::before { + content: "\53"; } + +.fa-timeline::before { + content: "\e29c"; } + +.fa-keyboard::before { + content: "\f11c"; } + +.fa-caret-down::before { + content: "\f0d7"; } + +.fa-house-chimney-medical::before { + content: "\f7f2"; } + +.fa-clinic-medical::before { + content: "\f7f2"; } + +.fa-temperature-three-quarters::before { + content: "\f2c8"; } + +.fa-temperature-3::before { + content: "\f2c8"; } + +.fa-thermometer-3::before { + content: "\f2c8"; } + +.fa-thermometer-three-quarters::before { + content: "\f2c8"; } + +.fa-mobile-screen::before { + content: "\f3cf"; } + +.fa-mobile-android-alt::before { + content: "\f3cf"; } + +.fa-plane-up::before { + content: "\e22d"; } + +.fa-piggy-bank::before { + content: "\f4d3"; } + +.fa-battery-half::before { + content: "\f242"; } + +.fa-battery-3::before { + content: "\f242"; } + +.fa-mountain-city::before { + content: "\e52e"; } + +.fa-coins::before { + content: "\f51e"; } + +.fa-khanda::before { + content: "\f66d"; } + +.fa-sliders::before { + content: "\f1de"; } + +.fa-sliders-h::before { + content: "\f1de"; } + +.fa-folder-tree::before { + content: "\f802"; } + +.fa-network-wired::before { + content: "\f6ff"; } + +.fa-map-pin::before { + content: "\f276"; } + +.fa-hamsa::before { + content: "\f665"; } + +.fa-cent-sign::before { + content: "\e3f5"; } + +.fa-flask::before { + content: "\f0c3"; } + +.fa-person-pregnant::before { + content: "\e31e"; } + +.fa-wand-sparkles::before { + content: "\f72b"; } + +.fa-ellipsis-vertical::before { + content: "\f142"; } + +.fa-ellipsis-v::before { + content: "\f142"; } + +.fa-ticket::before { + content: "\f145"; } + +.fa-power-off::before { + content: "\f011"; } + +.fa-right-long::before { + content: "\f30b"; } + +.fa-long-arrow-alt-right::before { + content: "\f30b"; } + +.fa-flag-usa::before { + content: "\f74d"; } + +.fa-laptop-file::before { + content: "\e51d"; } + +.fa-tty::before { + content: "\f1e4"; } + +.fa-teletype::before { + content: "\f1e4"; } + +.fa-diagram-next::before { + content: "\e476"; } + +.fa-person-rifle::before { + content: "\e54e"; } + +.fa-house-medical-circle-exclamation::before { + content: "\e512"; } + +.fa-closed-captioning::before { + content: "\f20a"; } + +.fa-person-hiking::before { + content: "\f6ec"; } + +.fa-hiking::before { + content: "\f6ec"; } + +.fa-venus-double::before { + content: "\f226"; } + +.fa-images::before { + content: "\f302"; } + +.fa-calculator::before { + content: "\f1ec"; } + +.fa-people-pulling::before { + content: "\e535"; } + +.fa-n::before { + content: "\4e"; } + +.fa-cable-car::before { + content: "\f7da"; } + +.fa-tram::before { + content: "\f7da"; } + +.fa-cloud-rain::before { + content: "\f73d"; } + +.fa-building-circle-xmark::before { + content: "\e4d4"; } + +.fa-ship::before { + content: "\f21a"; } + +.fa-arrows-down-to-line::before { + content: "\e4b8"; } + +.fa-download::before { + content: "\f019"; } + +.fa-face-grin::before { + content: "\f580"; } + +.fa-grin::before { + content: "\f580"; } + +.fa-delete-left::before { + content: "\f55a"; } + +.fa-backspace::before { + content: "\f55a"; } + +.fa-eye-dropper::before { + content: "\f1fb"; } + +.fa-eye-dropper-empty::before { + content: "\f1fb"; } + +.fa-eyedropper::before { + content: "\f1fb"; } + +.fa-file-circle-check::before { + content: "\e5a0"; } + +.fa-forward::before { + content: "\f04e"; } + +.fa-mobile::before { + content: "\f3ce"; } + +.fa-mobile-android::before { + content: "\f3ce"; } + +.fa-mobile-phone::before { + content: "\f3ce"; } + +.fa-face-meh::before { + content: "\f11a"; } + +.fa-meh::before { + content: "\f11a"; } + +.fa-align-center::before { + content: "\f037"; } + +.fa-book-skull::before { + content: "\f6b7"; } + +.fa-book-dead::before { + content: "\f6b7"; } + +.fa-id-card::before { + content: "\f2c2"; } + +.fa-drivers-license::before { + content: "\f2c2"; } + +.fa-outdent::before { + content: "\f03b"; } + +.fa-dedent::before { + content: "\f03b"; } + +.fa-heart-circle-exclamation::before { + content: "\e4fe"; } + +.fa-house::before { + content: "\f015"; } + +.fa-home::before { + content: "\f015"; } + +.fa-home-alt::before { + content: "\f015"; } + +.fa-home-lg-alt::before { + content: "\f015"; } + +.fa-calendar-week::before { + content: "\f784"; } + +.fa-laptop-medical::before { + content: "\f812"; } + +.fa-b::before { + content: "\42"; } + +.fa-file-medical::before { + content: "\f477"; } + +.fa-dice-one::before { + content: "\f525"; } + +.fa-kiwi-bird::before { + content: "\f535"; } + +.fa-arrow-right-arrow-left::before { + content: "\f0ec"; } + +.fa-exchange::before { + content: "\f0ec"; } + +.fa-rotate-right::before { + content: "\f2f9"; } + +.fa-redo-alt::before { + content: "\f2f9"; } + +.fa-rotate-forward::before { + content: "\f2f9"; } + +.fa-utensils::before { + content: "\f2e7"; } + +.fa-cutlery::before { + content: "\f2e7"; } + +.fa-arrow-up-wide-short::before { + content: "\f161"; } + +.fa-sort-amount-up::before { + content: "\f161"; } + +.fa-mill-sign::before { + content: "\e1ed"; } + +.fa-bowl-rice::before { + content: "\e2eb"; } + +.fa-skull::before { + content: "\f54c"; } + +.fa-tower-broadcast::before { + content: "\f519"; } + +.fa-broadcast-tower::before { + content: "\f519"; } + +.fa-truck-pickup::before { + content: "\f63c"; } + +.fa-up-long::before { + content: "\f30c"; } + +.fa-long-arrow-alt-up::before { + content: "\f30c"; } + +.fa-stop::before { + content: "\f04d"; } + +.fa-code-merge::before { + content: "\f387"; } + +.fa-upload::before { + content: "\f093"; } + +.fa-hurricane::before { + content: "\f751"; } + +.fa-mound::before { + content: "\e52d"; } + +.fa-toilet-portable::before { + content: "\e583"; } + +.fa-compact-disc::before { + content: "\f51f"; } + +.fa-file-arrow-down::before { + content: "\f56d"; } + +.fa-file-download::before { + content: "\f56d"; } + +.fa-caravan::before { + content: "\f8ff"; } + +.fa-shield-cat::before { + content: "\e572"; } + +.fa-bolt::before { + content: "\f0e7"; } + +.fa-zap::before { + content: "\f0e7"; } + +.fa-glass-water::before { + content: "\e4f4"; } + +.fa-oil-well::before { + content: "\e532"; } + +.fa-vault::before { + content: "\e2c5"; } + +.fa-mars::before { + content: "\f222"; } + +.fa-toilet::before { + content: "\f7d8"; } + +.fa-plane-circle-xmark::before { + content: "\e557"; } + +.fa-yen-sign::before { + content: "\f157"; } + +.fa-cny::before { + content: "\f157"; } + +.fa-jpy::before { + content: "\f157"; } + +.fa-rmb::before { + content: "\f157"; } + +.fa-yen::before { + content: "\f157"; } + +.fa-ruble-sign::before { + content: "\f158"; } + +.fa-rouble::before { + content: "\f158"; } + +.fa-rub::before { + content: "\f158"; } + +.fa-ruble::before { + content: "\f158"; } + +.fa-sun::before { + content: "\f185"; } + +.fa-guitar::before { + content: "\f7a6"; } + +.fa-face-laugh-wink::before { + content: "\f59c"; } + +.fa-laugh-wink::before { + content: "\f59c"; } + +.fa-horse-head::before { + content: "\f7ab"; } + +.fa-bore-hole::before { + content: "\e4c3"; } + +.fa-industry::before { + content: "\f275"; } + +.fa-circle-down::before { + content: "\f358"; } + +.fa-arrow-alt-circle-down::before { + content: "\f358"; } + +.fa-arrows-turn-to-dots::before { + content: "\e4c1"; } + +.fa-florin-sign::before { + content: "\e184"; } + +.fa-arrow-down-short-wide::before { + content: "\f884"; } + +.fa-sort-amount-desc::before { + content: "\f884"; } + +.fa-sort-amount-down-alt::before { + content: "\f884"; } + +.fa-less-than::before { + content: "\3c"; } + +.fa-angle-down::before { + content: "\f107"; } + +.fa-car-tunnel::before { + content: "\e4de"; } + +.fa-head-side-cough::before { + content: "\e061"; } + +.fa-grip-lines::before { + content: "\f7a4"; } + +.fa-thumbs-down::before { + content: "\f165"; } + +.fa-user-lock::before { + content: "\f502"; } + +.fa-arrow-right-long::before { + content: "\f178"; } + +.fa-long-arrow-right::before { + content: "\f178"; } + +.fa-anchor-circle-xmark::before { + content: "\e4ac"; } + +.fa-ellipsis::before { + content: "\f141"; } + +.fa-ellipsis-h::before { + content: "\f141"; } + +.fa-chess-pawn::before { + content: "\f443"; } + +.fa-kit-medical::before { + content: "\f479"; } + +.fa-first-aid::before { + content: "\f479"; } + +.fa-person-through-window::before { + content: "\e5a9"; } + +.fa-toolbox::before { + content: "\f552"; } + +.fa-hands-holding-circle::before { + content: "\e4fb"; } + +.fa-bug::before { + content: "\f188"; } + +.fa-credit-card::before { + content: "\f09d"; } + +.fa-credit-card-alt::before { + content: "\f09d"; } + +.fa-car::before { + content: "\f1b9"; } + +.fa-automobile::before { + content: "\f1b9"; } + +.fa-hand-holding-hand::before { + content: "\e4f7"; } + +.fa-book-open-reader::before { + content: "\f5da"; } + +.fa-book-reader::before { + content: "\f5da"; } + +.fa-mountain-sun::before { + content: "\e52f"; } + +.fa-arrows-left-right-to-line::before { + content: "\e4ba"; } + +.fa-dice-d20::before { + content: "\f6cf"; } + +.fa-truck-droplet::before { + content: "\e58c"; } + +.fa-file-circle-xmark::before { + content: "\e5a1"; } + +.fa-temperature-arrow-up::before { + content: "\e040"; } + +.fa-temperature-up::before { + content: "\e040"; } + +.fa-medal::before { + content: "\f5a2"; } + +.fa-bed::before { + content: "\f236"; } + +.fa-square-h::before { + content: "\f0fd"; } + +.fa-h-square::before { + content: "\f0fd"; } + +.fa-podcast::before { + content: "\f2ce"; } + +.fa-temperature-full::before { + content: "\f2c7"; } + +.fa-temperature-4::before { + content: "\f2c7"; } + +.fa-thermometer-4::before { + content: "\f2c7"; } + +.fa-thermometer-full::before { + content: "\f2c7"; } + +.fa-bell::before { + content: "\f0f3"; } + +.fa-superscript::before { + content: "\f12b"; } + +.fa-plug-circle-xmark::before { + content: "\e560"; } + +.fa-star-of-life::before { + content: "\f621"; } + +.fa-phone-slash::before { + content: "\f3dd"; } + +.fa-paint-roller::before { + content: "\f5aa"; } + +.fa-handshake-angle::before { + content: "\f4c4"; } + +.fa-hands-helping::before { + content: "\f4c4"; } + +.fa-location-dot::before { + content: "\f3c5"; } + +.fa-map-marker-alt::before { + content: "\f3c5"; } + +.fa-file::before { + content: "\f15b"; } + +.fa-greater-than::before { + content: "\3e"; } + +.fa-person-swimming::before { + content: "\f5c4"; } + +.fa-swimmer::before { + content: "\f5c4"; } + +.fa-arrow-down::before { + content: "\f063"; } + +.fa-droplet::before { + content: "\f043"; } + +.fa-tint::before { + content: "\f043"; } + +.fa-eraser::before { + content: "\f12d"; } + +.fa-earth-americas::before { + content: "\f57d"; } + +.fa-earth::before { + content: "\f57d"; } + +.fa-earth-america::before { + content: "\f57d"; } + +.fa-globe-americas::before { + content: "\f57d"; } + +.fa-person-burst::before { + content: "\e53b"; } + +.fa-dove::before { + content: "\f4ba"; } + +.fa-battery-empty::before { + content: "\f244"; } + +.fa-battery-0::before { + content: "\f244"; } + +.fa-socks::before { + content: "\f696"; } + +.fa-inbox::before { + content: "\f01c"; } + +.fa-section::before { + content: "\e447"; } + +.fa-gauge-high::before { + content: "\f625"; } + +.fa-tachometer-alt::before { + content: "\f625"; } + +.fa-tachometer-alt-fast::before { + content: "\f625"; } + +.fa-envelope-open-text::before { + content: "\f658"; } + +.fa-hospital::before { + content: "\f0f8"; } + +.fa-hospital-alt::before { + content: "\f0f8"; } + +.fa-hospital-wide::before { + content: "\f0f8"; } + +.fa-wine-bottle::before { + content: "\f72f"; } + +.fa-chess-rook::before { + content: "\f447"; } + +.fa-bars-staggered::before { + content: "\f550"; } + +.fa-reorder::before { + content: "\f550"; } + +.fa-stream::before { + content: "\f550"; } + +.fa-dharmachakra::before { + content: "\f655"; } + +.fa-hotdog::before { + content: "\f80f"; } + +.fa-person-walking-with-cane::before { + content: "\f29d"; } + +.fa-blind::before { + content: "\f29d"; } + +.fa-drum::before { + content: "\f569"; } + +.fa-ice-cream::before { + content: "\f810"; } + +.fa-heart-circle-bolt::before { + content: "\e4fc"; } + +.fa-fax::before { + content: "\f1ac"; } + +.fa-paragraph::before { + content: "\f1dd"; } + +.fa-check-to-slot::before { + content: "\f772"; } + +.fa-vote-yea::before { + content: "\f772"; } + +.fa-star-half::before { + content: "\f089"; } + +.fa-boxes-stacked::before { + content: "\f468"; } + +.fa-boxes::before { + content: "\f468"; } + +.fa-boxes-alt::before { + content: "\f468"; } + +.fa-link::before { + content: "\f0c1"; } + +.fa-chain::before { + content: "\f0c1"; } + +.fa-ear-listen::before { + content: "\f2a2"; } + +.fa-assistive-listening-systems::before { + content: "\f2a2"; } + +.fa-tree-city::before { + content: "\e587"; } + +.fa-play::before { + content: "\f04b"; } + +.fa-font::before { + content: "\f031"; } + +.fa-table-cells-row-lock::before { + content: "\e67a"; } + +.fa-rupiah-sign::before { + content: "\e23d"; } + +.fa-magnifying-glass::before { + content: "\f002"; } + +.fa-search::before { + content: "\f002"; } + +.fa-table-tennis-paddle-ball::before { + content: "\f45d"; } + +.fa-ping-pong-paddle-ball::before { + content: "\f45d"; } + +.fa-table-tennis::before { + content: "\f45d"; } + +.fa-person-dots-from-line::before { + content: "\f470"; } + +.fa-diagnoses::before { + content: "\f470"; } + +.fa-trash-can-arrow-up::before { + content: "\f82a"; } + +.fa-trash-restore-alt::before { + content: "\f82a"; } + +.fa-naira-sign::before { + content: "\e1f6"; } + +.fa-cart-arrow-down::before { + content: "\f218"; } + +.fa-walkie-talkie::before { + content: "\f8ef"; } + +.fa-file-pen::before { + content: "\f31c"; } + +.fa-file-edit::before { + content: "\f31c"; } + +.fa-receipt::before { + content: "\f543"; } + +.fa-square-pen::before { + content: "\f14b"; } + +.fa-pen-square::before { + content: "\f14b"; } + +.fa-pencil-square::before { + content: "\f14b"; } + +.fa-suitcase-rolling::before { + content: "\f5c1"; } + +.fa-person-circle-exclamation::before { + content: "\e53f"; } + +.fa-chevron-down::before { + content: "\f078"; } + +.fa-battery-full::before { + content: "\f240"; } + +.fa-battery::before { + content: "\f240"; } + +.fa-battery-5::before { + content: "\f240"; } + +.fa-skull-crossbones::before { + content: "\f714"; } + +.fa-code-compare::before { + content: "\e13a"; } + +.fa-list-ul::before { + content: "\f0ca"; } + +.fa-list-dots::before { + content: "\f0ca"; } + +.fa-school-lock::before { + content: "\e56f"; } + +.fa-tower-cell::before { + content: "\e585"; } + +.fa-down-long::before { + content: "\f309"; } + +.fa-long-arrow-alt-down::before { + content: "\f309"; } + +.fa-ranking-star::before { + content: "\e561"; } + +.fa-chess-king::before { + content: "\f43f"; } + +.fa-person-harassing::before { + content: "\e549"; } + +.fa-brazilian-real-sign::before { + content: "\e46c"; } + +.fa-landmark-dome::before { + content: "\f752"; } + +.fa-landmark-alt::before { + content: "\f752"; } + +.fa-arrow-up::before { + content: "\f062"; } + +.fa-tv::before { + content: "\f26c"; } + +.fa-television::before { + content: "\f26c"; } + +.fa-tv-alt::before { + content: "\f26c"; } + +.fa-shrimp::before { + content: "\e448"; } + +.fa-list-check::before { + content: "\f0ae"; } + +.fa-tasks::before { + content: "\f0ae"; } + +.fa-jug-detergent::before { + content: "\e519"; } + +.fa-circle-user::before { + content: "\f2bd"; } + +.fa-user-circle::before { + content: "\f2bd"; } + +.fa-user-shield::before { + content: "\f505"; } + +.fa-wind::before { + content: "\f72e"; } + +.fa-car-burst::before { + content: "\f5e1"; } + +.fa-car-crash::before { + content: "\f5e1"; } + +.fa-y::before { + content: "\59"; } + +.fa-person-snowboarding::before { + content: "\f7ce"; } + +.fa-snowboarding::before { + content: "\f7ce"; } + +.fa-truck-fast::before { + content: "\f48b"; } + +.fa-shipping-fast::before { + content: "\f48b"; } + +.fa-fish::before { + content: "\f578"; } + +.fa-user-graduate::before { + content: "\f501"; } + +.fa-circle-half-stroke::before { + content: "\f042"; } + +.fa-adjust::before { + content: "\f042"; } + +.fa-clapperboard::before { + content: "\e131"; } + +.fa-circle-radiation::before { + content: "\f7ba"; } + +.fa-radiation-alt::before { + content: "\f7ba"; } + +.fa-baseball::before { + content: "\f433"; } + +.fa-baseball-ball::before { + content: "\f433"; } + +.fa-jet-fighter-up::before { + content: "\e518"; } + +.fa-diagram-project::before { + content: "\f542"; } + +.fa-project-diagram::before { + content: "\f542"; } + +.fa-copy::before { + content: "\f0c5"; } + +.fa-volume-xmark::before { + content: "\f6a9"; } + +.fa-volume-mute::before { + content: "\f6a9"; } + +.fa-volume-times::before { + content: "\f6a9"; } + +.fa-hand-sparkles::before { + content: "\e05d"; } + +.fa-grip::before { + content: "\f58d"; } + +.fa-grip-horizontal::before { + content: "\f58d"; } + +.fa-share-from-square::before { + content: "\f14d"; } + +.fa-share-square::before { + content: "\f14d"; } + +.fa-child-combatant::before { + content: "\e4e0"; } + +.fa-child-rifle::before { + content: "\e4e0"; } + +.fa-gun::before { + content: "\e19b"; } + +.fa-square-phone::before { + content: "\f098"; } + +.fa-phone-square::before { + content: "\f098"; } + +.fa-plus::before { + content: "\2b"; } + +.fa-add::before { + content: "\2b"; } + +.fa-expand::before { + content: "\f065"; } + +.fa-computer::before { + content: "\e4e5"; } + +.fa-xmark::before { + content: "\f00d"; } + +.fa-close::before { + content: "\f00d"; } + +.fa-multiply::before { + content: "\f00d"; } + +.fa-remove::before { + content: "\f00d"; } + +.fa-times::before { + content: "\f00d"; } + +.fa-arrows-up-down-left-right::before { + content: "\f047"; } + +.fa-arrows::before { + content: "\f047"; } + +.fa-chalkboard-user::before { + content: "\f51c"; } + +.fa-chalkboard-teacher::before { + content: "\f51c"; } + +.fa-peso-sign::before { + content: "\e222"; } + +.fa-building-shield::before { + content: "\e4d8"; } + +.fa-baby::before { + content: "\f77c"; } + +.fa-users-line::before { + content: "\e592"; } + +.fa-quote-left::before { + content: "\f10d"; } + +.fa-quote-left-alt::before { + content: "\f10d"; } + +.fa-tractor::before { + content: "\f722"; } + +.fa-trash-arrow-up::before { + content: "\f829"; } + +.fa-trash-restore::before { + content: "\f829"; } + +.fa-arrow-down-up-lock::before { + content: "\e4b0"; } + +.fa-lines-leaning::before { + content: "\e51e"; } + +.fa-ruler-combined::before { + content: "\f546"; } + +.fa-copyright::before { + content: "\f1f9"; } + +.fa-equals::before { + content: "\3d"; } + +.fa-blender::before { + content: "\f517"; } + +.fa-teeth::before { + content: "\f62e"; } + +.fa-shekel-sign::before { + content: "\f20b"; } + +.fa-ils::before { + content: "\f20b"; } + +.fa-shekel::before { + content: "\f20b"; } + +.fa-sheqel::before { + content: "\f20b"; } + +.fa-sheqel-sign::before { + content: "\f20b"; } + +.fa-map::before { + content: "\f279"; } + +.fa-rocket::before { + content: "\f135"; } + +.fa-photo-film::before { + content: "\f87c"; } + +.fa-photo-video::before { + content: "\f87c"; } + +.fa-folder-minus::before { + content: "\f65d"; } + +.fa-store::before { + content: "\f54e"; } + +.fa-arrow-trend-up::before { + content: "\e098"; } + +.fa-plug-circle-minus::before { + content: "\e55e"; } + +.fa-sign-hanging::before { + content: "\f4d9"; } + +.fa-sign::before { + content: "\f4d9"; } + +.fa-bezier-curve::before { + content: "\f55b"; } + +.fa-bell-slash::before { + content: "\f1f6"; } + +.fa-tablet::before { + content: "\f3fb"; } + +.fa-tablet-android::before { + content: "\f3fb"; } + +.fa-school-flag::before { + content: "\e56e"; } + +.fa-fill::before { + content: "\f575"; } + +.fa-angle-up::before { + content: "\f106"; } + +.fa-drumstick-bite::before { + content: "\f6d7"; } + +.fa-holly-berry::before { + content: "\f7aa"; } + +.fa-chevron-left::before { + content: "\f053"; } + +.fa-bacteria::before { + content: "\e059"; } + +.fa-hand-lizard::before { + content: "\f258"; } + +.fa-notdef::before { + content: "\e1fe"; } + +.fa-disease::before { + content: "\f7fa"; } + +.fa-briefcase-medical::before { + content: "\f469"; } + +.fa-genderless::before { + content: "\f22d"; } + +.fa-chevron-right::before { + content: "\f054"; } + +.fa-retweet::before { + content: "\f079"; } + +.fa-car-rear::before { + content: "\f5de"; } + +.fa-car-alt::before { + content: "\f5de"; } + +.fa-pump-soap::before { + content: "\e06b"; } + +.fa-video-slash::before { + content: "\f4e2"; } + +.fa-battery-quarter::before { + content: "\f243"; } + +.fa-battery-2::before { + content: "\f243"; } + +.fa-radio::before { + content: "\f8d7"; } + +.fa-baby-carriage::before { + content: "\f77d"; } + +.fa-carriage-baby::before { + content: "\f77d"; } + +.fa-traffic-light::before { + content: "\f637"; } + +.fa-thermometer::before { + content: "\f491"; } + +.fa-vr-cardboard::before { + content: "\f729"; } + +.fa-hand-middle-finger::before { + content: "\f806"; } + +.fa-percent::before { + content: "\25"; } + +.fa-percentage::before { + content: "\25"; } + +.fa-truck-moving::before { + content: "\f4df"; } + +.fa-glass-water-droplet::before { + content: "\e4f5"; } + +.fa-display::before { + content: "\e163"; } + +.fa-face-smile::before { + content: "\f118"; } + +.fa-smile::before { + content: "\f118"; } + +.fa-thumbtack::before { + content: "\f08d"; } + +.fa-thumb-tack::before { + content: "\f08d"; } + +.fa-trophy::before { + content: "\f091"; } + +.fa-person-praying::before { + content: "\f683"; } + +.fa-pray::before { + content: "\f683"; } + +.fa-hammer::before { + content: "\f6e3"; } + +.fa-hand-peace::before { + content: "\f25b"; } + +.fa-rotate::before { + content: "\f2f1"; } + +.fa-sync-alt::before { + content: "\f2f1"; } + +.fa-spinner::before { + content: "\f110"; } + +.fa-robot::before { + content: "\f544"; } + +.fa-peace::before { + content: "\f67c"; } + +.fa-gears::before { + content: "\f085"; } + +.fa-cogs::before { + content: "\f085"; } + +.fa-warehouse::before { + content: "\f494"; } + +.fa-arrow-up-right-dots::before { + content: "\e4b7"; } + +.fa-splotch::before { + content: "\f5bc"; } + +.fa-face-grin-hearts::before { + content: "\f584"; } + +.fa-grin-hearts::before { + content: "\f584"; } + +.fa-dice-four::before { + content: "\f524"; } + +.fa-sim-card::before { + content: "\f7c4"; } + +.fa-transgender::before { + content: "\f225"; } + +.fa-transgender-alt::before { + content: "\f225"; } + +.fa-mercury::before { + content: "\f223"; } + +.fa-arrow-turn-down::before { + content: "\f149"; } + +.fa-level-down::before { + content: "\f149"; } + +.fa-person-falling-burst::before { + content: "\e547"; } + +.fa-award::before { + content: "\f559"; } + +.fa-ticket-simple::before { + content: "\f3ff"; } + +.fa-ticket-alt::before { + content: "\f3ff"; } + +.fa-building::before { + content: "\f1ad"; } + +.fa-angles-left::before { + content: "\f100"; } + +.fa-angle-double-left::before { + content: "\f100"; } + +.fa-qrcode::before { + content: "\f029"; } + +.fa-clock-rotate-left::before { + content: "\f1da"; } + +.fa-history::before { + content: "\f1da"; } + +.fa-face-grin-beam-sweat::before { + content: "\f583"; } + +.fa-grin-beam-sweat::before { + content: "\f583"; } + +.fa-file-export::before { + content: "\f56e"; } + +.fa-arrow-right-from-file::before { + content: "\f56e"; } + +.fa-shield::before { + content: "\f132"; } + +.fa-shield-blank::before { + content: "\f132"; } + +.fa-arrow-up-short-wide::before { + content: "\f885"; } + +.fa-sort-amount-up-alt::before { + content: "\f885"; } + +.fa-house-medical::before { + content: "\e3b2"; } + +.fa-golf-ball-tee::before { + content: "\f450"; } + +.fa-golf-ball::before { + content: "\f450"; } + +.fa-circle-chevron-left::before { + content: "\f137"; } + +.fa-chevron-circle-left::before { + content: "\f137"; } + +.fa-house-chimney-window::before { + content: "\e00d"; } + +.fa-pen-nib::before { + content: "\f5ad"; } + +.fa-tent-arrow-turn-left::before { + content: "\e580"; } + +.fa-tents::before { + content: "\e582"; } + +.fa-wand-magic::before { + content: "\f0d0"; } + +.fa-magic::before { + content: "\f0d0"; } + +.fa-dog::before { + content: "\f6d3"; } + +.fa-carrot::before { + content: "\f787"; } + +.fa-moon::before { + content: "\f186"; } + +.fa-wine-glass-empty::before { + content: "\f5ce"; } + +.fa-wine-glass-alt::before { + content: "\f5ce"; } + +.fa-cheese::before { + content: "\f7ef"; } + +.fa-yin-yang::before { + content: "\f6ad"; } + +.fa-music::before { + content: "\f001"; } + +.fa-code-commit::before { + content: "\f386"; } + +.fa-temperature-low::before { + content: "\f76b"; } + +.fa-person-biking::before { + content: "\f84a"; } + +.fa-biking::before { + content: "\f84a"; } + +.fa-broom::before { + content: "\f51a"; } + +.fa-shield-heart::before { + content: "\e574"; } + +.fa-gopuram::before { + content: "\f664"; } + +.fa-earth-oceania::before { + content: "\e47b"; } + +.fa-globe-oceania::before { + content: "\e47b"; } + +.fa-square-xmark::before { + content: "\f2d3"; } + +.fa-times-square::before { + content: "\f2d3"; } + +.fa-xmark-square::before { + content: "\f2d3"; } + +.fa-hashtag::before { + content: "\23"; } + +.fa-up-right-and-down-left-from-center::before { + content: "\f424"; } + +.fa-expand-alt::before { + content: "\f424"; } + +.fa-oil-can::before { + content: "\f613"; } + +.fa-t::before { + content: "\54"; } + +.fa-hippo::before { + content: "\f6ed"; } + +.fa-chart-column::before { + content: "\e0e3"; } + +.fa-infinity::before { + content: "\f534"; } + +.fa-vial-circle-check::before { + content: "\e596"; } + +.fa-person-arrow-down-to-line::before { + content: "\e538"; } + +.fa-voicemail::before { + content: "\f897"; } + +.fa-fan::before { + content: "\f863"; } + +.fa-person-walking-luggage::before { + content: "\e554"; } + +.fa-up-down::before { + content: "\f338"; } + +.fa-arrows-alt-v::before { + content: "\f338"; } + +.fa-cloud-moon-rain::before { + content: "\f73c"; } + +.fa-calendar::before { + content: "\f133"; } + +.fa-trailer::before { + content: "\e041"; } + +.fa-bahai::before { + content: "\f666"; } + +.fa-haykal::before { + content: "\f666"; } + +.fa-sd-card::before { + content: "\f7c2"; } + +.fa-dragon::before { + content: "\f6d5"; } + +.fa-shoe-prints::before { + content: "\f54b"; } + +.fa-circle-plus::before { + content: "\f055"; } + +.fa-plus-circle::before { + content: "\f055"; } + +.fa-face-grin-tongue-wink::before { + content: "\f58b"; } + +.fa-grin-tongue-wink::before { + content: "\f58b"; } + +.fa-hand-holding::before { + content: "\f4bd"; } + +.fa-plug-circle-exclamation::before { + content: "\e55d"; } + +.fa-link-slash::before { + content: "\f127"; } + +.fa-chain-broken::before { + content: "\f127"; } + +.fa-chain-slash::before { + content: "\f127"; } + +.fa-unlink::before { + content: "\f127"; } + +.fa-clone::before { + content: "\f24d"; } + +.fa-person-walking-arrow-loop-left::before { + content: "\e551"; } + +.fa-arrow-up-z-a::before { + content: "\f882"; } + +.fa-sort-alpha-up-alt::before { + content: "\f882"; } + +.fa-fire-flame-curved::before { + content: "\f7e4"; } + +.fa-fire-alt::before { + content: "\f7e4"; } + +.fa-tornado::before { + content: "\f76f"; } + +.fa-file-circle-plus::before { + content: "\e494"; } + +.fa-book-quran::before { + content: "\f687"; } + +.fa-quran::before { + content: "\f687"; } + +.fa-anchor::before { + content: "\f13d"; } + +.fa-border-all::before { + content: "\f84c"; } + +.fa-face-angry::before { + content: "\f556"; } + +.fa-angry::before { + content: "\f556"; } + +.fa-cookie-bite::before { + content: "\f564"; } + +.fa-arrow-trend-down::before { + content: "\e097"; } + +.fa-rss::before { + content: "\f09e"; } + +.fa-feed::before { + content: "\f09e"; } + +.fa-draw-polygon::before { + content: "\f5ee"; } + +.fa-scale-balanced::before { + content: "\f24e"; } + +.fa-balance-scale::before { + content: "\f24e"; } + +.fa-gauge-simple-high::before { + content: "\f62a"; } + +.fa-tachometer::before { + content: "\f62a"; } + +.fa-tachometer-fast::before { + content: "\f62a"; } + +.fa-shower::before { + content: "\f2cc"; } + +.fa-desktop::before { + content: "\f390"; } + +.fa-desktop-alt::before { + content: "\f390"; } + +.fa-m::before { + content: "\4d"; } + +.fa-table-list::before { + content: "\f00b"; } + +.fa-th-list::before { + content: "\f00b"; } + +.fa-comment-sms::before { + content: "\f7cd"; } + +.fa-sms::before { + content: "\f7cd"; } + +.fa-book::before { + content: "\f02d"; } + +.fa-user-plus::before { + content: "\f234"; } + +.fa-check::before { + content: "\f00c"; } + +.fa-battery-three-quarters::before { + content: "\f241"; } + +.fa-battery-4::before { + content: "\f241"; } + +.fa-house-circle-check::before { + content: "\e509"; } + +.fa-angle-left::before { + content: "\f104"; } + +.fa-diagram-successor::before { + content: "\e47a"; } + +.fa-truck-arrow-right::before { + content: "\e58b"; } + +.fa-arrows-split-up-and-left::before { + content: "\e4bc"; } + +.fa-hand-fist::before { + content: "\f6de"; } + +.fa-fist-raised::before { + content: "\f6de"; } + +.fa-cloud-moon::before { + content: "\f6c3"; } + +.fa-briefcase::before { + content: "\f0b1"; } + +.fa-person-falling::before { + content: "\e546"; } + +.fa-image-portrait::before { + content: "\f3e0"; } + +.fa-portrait::before { + content: "\f3e0"; } + +.fa-user-tag::before { + content: "\f507"; } + +.fa-rug::before { + content: "\e569"; } + +.fa-earth-europe::before { + content: "\f7a2"; } + +.fa-globe-europe::before { + content: "\f7a2"; } + +.fa-cart-flatbed-suitcase::before { + content: "\f59d"; } + +.fa-luggage-cart::before { + content: "\f59d"; } + +.fa-rectangle-xmark::before { + content: "\f410"; } + +.fa-rectangle-times::before { + content: "\f410"; } + +.fa-times-rectangle::before { + content: "\f410"; } + +.fa-window-close::before { + content: "\f410"; } + +.fa-baht-sign::before { + content: "\e0ac"; } + +.fa-book-open::before { + content: "\f518"; } + +.fa-book-journal-whills::before { + content: "\f66a"; } + +.fa-journal-whills::before { + content: "\f66a"; } + +.fa-handcuffs::before { + content: "\e4f8"; } + +.fa-triangle-exclamation::before { + content: "\f071"; } + +.fa-exclamation-triangle::before { + content: "\f071"; } + +.fa-warning::before { + content: "\f071"; } + +.fa-database::before { + content: "\f1c0"; } + +.fa-share::before { + content: "\f064"; } + +.fa-mail-forward::before { + content: "\f064"; } + +.fa-bottle-droplet::before { + content: "\e4c4"; } + +.fa-mask-face::before { + content: "\e1d7"; } + +.fa-hill-rockslide::before { + content: "\e508"; } + +.fa-right-left::before { + content: "\f362"; } + +.fa-exchange-alt::before { + content: "\f362"; } + +.fa-paper-plane::before { + content: "\f1d8"; } + +.fa-road-circle-exclamation::before { + content: "\e565"; } + +.fa-dungeon::before { + content: "\f6d9"; } + +.fa-align-right::before { + content: "\f038"; } + +.fa-money-bill-1-wave::before { + content: "\f53b"; } + +.fa-money-bill-wave-alt::before { + content: "\f53b"; } + +.fa-life-ring::before { + content: "\f1cd"; } + +.fa-hands::before { + content: "\f2a7"; } + +.fa-sign-language::before { + content: "\f2a7"; } + +.fa-signing::before { + content: "\f2a7"; } + +.fa-calendar-day::before { + content: "\f783"; } + +.fa-water-ladder::before { + content: "\f5c5"; } + +.fa-ladder-water::before { + content: "\f5c5"; } + +.fa-swimming-pool::before { + content: "\f5c5"; } + +.fa-arrows-up-down::before { + content: "\f07d"; } + +.fa-arrows-v::before { + content: "\f07d"; } + +.fa-face-grimace::before { + content: "\f57f"; } + +.fa-grimace::before { + content: "\f57f"; } + +.fa-wheelchair-move::before { + content: "\e2ce"; } + +.fa-wheelchair-alt::before { + content: "\e2ce"; } + +.fa-turn-down::before { + content: "\f3be"; } + +.fa-level-down-alt::before { + content: "\f3be"; } + +.fa-person-walking-arrow-right::before { + content: "\e552"; } + +.fa-square-envelope::before { + content: "\f199"; } + +.fa-envelope-square::before { + content: "\f199"; } + +.fa-dice::before { + content: "\f522"; } + +.fa-bowling-ball::before { + content: "\f436"; } + +.fa-brain::before { + content: "\f5dc"; } + +.fa-bandage::before { + content: "\f462"; } + +.fa-band-aid::before { + content: "\f462"; } + +.fa-calendar-minus::before { + content: "\f272"; } + +.fa-circle-xmark::before { + content: "\f057"; } + +.fa-times-circle::before { + content: "\f057"; } + +.fa-xmark-circle::before { + content: "\f057"; } + +.fa-gifts::before { + content: "\f79c"; } + +.fa-hotel::before { + content: "\f594"; } + +.fa-earth-asia::before { + content: "\f57e"; } + +.fa-globe-asia::before { + content: "\f57e"; } + +.fa-id-card-clip::before { + content: "\f47f"; } + +.fa-id-card-alt::before { + content: "\f47f"; } + +.fa-magnifying-glass-plus::before { + content: "\f00e"; } + +.fa-search-plus::before { + content: "\f00e"; } + +.fa-thumbs-up::before { + content: "\f164"; } + +.fa-user-clock::before { + content: "\f4fd"; } + +.fa-hand-dots::before { + content: "\f461"; } + +.fa-allergies::before { + content: "\f461"; } + +.fa-file-invoice::before { + content: "\f570"; } + +.fa-window-minimize::before { + content: "\f2d1"; } + +.fa-mug-saucer::before { + content: "\f0f4"; } + +.fa-coffee::before { + content: "\f0f4"; } + +.fa-brush::before { + content: "\f55d"; } + +.fa-mask::before { + content: "\f6fa"; } + +.fa-magnifying-glass-minus::before { + content: "\f010"; } + +.fa-search-minus::before { + content: "\f010"; } + +.fa-ruler-vertical::before { + content: "\f548"; } + +.fa-user-large::before { + content: "\f406"; } + +.fa-user-alt::before { + content: "\f406"; } + +.fa-train-tram::before { + content: "\e5b4"; } + +.fa-user-nurse::before { + content: "\f82f"; } + +.fa-syringe::before { + content: "\f48e"; } + +.fa-cloud-sun::before { + content: "\f6c4"; } + +.fa-stopwatch-20::before { + content: "\e06f"; } + +.fa-square-full::before { + content: "\f45c"; } + +.fa-magnet::before { + content: "\f076"; } + +.fa-jar::before { + content: "\e516"; } + +.fa-note-sticky::before { + content: "\f249"; } + +.fa-sticky-note::before { + content: "\f249"; } + +.fa-bug-slash::before { + content: "\e490"; } + +.fa-arrow-up-from-water-pump::before { + content: "\e4b6"; } + +.fa-bone::before { + content: "\f5d7"; } + +.fa-user-injured::before { + content: "\f728"; } + +.fa-face-sad-tear::before { + content: "\f5b4"; } + +.fa-sad-tear::before { + content: "\f5b4"; } + +.fa-plane::before { + content: "\f072"; } + +.fa-tent-arrows-down::before { + content: "\e581"; } + +.fa-exclamation::before { + content: "\21"; } + +.fa-arrows-spin::before { + content: "\e4bb"; } + +.fa-print::before { + content: "\f02f"; } + +.fa-turkish-lira-sign::before { + content: "\e2bb"; } + +.fa-try::before { + content: "\e2bb"; } + +.fa-turkish-lira::before { + content: "\e2bb"; } + +.fa-dollar-sign::before { + content: "\24"; } + +.fa-dollar::before { + content: "\24"; } + +.fa-usd::before { + content: "\24"; } + +.fa-x::before { + content: "\58"; } + +.fa-magnifying-glass-dollar::before { + content: "\f688"; } + +.fa-search-dollar::before { + content: "\f688"; } + +.fa-users-gear::before { + content: "\f509"; } + +.fa-users-cog::before { + content: "\f509"; } + +.fa-person-military-pointing::before { + content: "\e54a"; } + +.fa-building-columns::before { + content: "\f19c"; } + +.fa-bank::before { + content: "\f19c"; } + +.fa-institution::before { + content: "\f19c"; } + +.fa-museum::before { + content: "\f19c"; } + +.fa-university::before { + content: "\f19c"; } + +.fa-umbrella::before { + content: "\f0e9"; } + +.fa-trowel::before { + content: "\e589"; } + +.fa-d::before { + content: "\44"; } + +.fa-stapler::before { + content: "\e5af"; } + +.fa-masks-theater::before { + content: "\f630"; } + +.fa-theater-masks::before { + content: "\f630"; } + +.fa-kip-sign::before { + content: "\e1c4"; } + +.fa-hand-point-left::before { + content: "\f0a5"; } + +.fa-handshake-simple::before { + content: "\f4c6"; } + +.fa-handshake-alt::before { + content: "\f4c6"; } + +.fa-jet-fighter::before { + content: "\f0fb"; } + +.fa-fighter-jet::before { + content: "\f0fb"; } + +.fa-square-share-nodes::before { + content: "\f1e1"; } + +.fa-share-alt-square::before { + content: "\f1e1"; } + +.fa-barcode::before { + content: "\f02a"; } + +.fa-plus-minus::before { + content: "\e43c"; } + +.fa-video::before { + content: "\f03d"; } + +.fa-video-camera::before { + content: "\f03d"; } + +.fa-graduation-cap::before { + content: "\f19d"; } + +.fa-mortar-board::before { + content: "\f19d"; } + +.fa-hand-holding-medical::before { + content: "\e05c"; } + +.fa-person-circle-check::before { + content: "\e53e"; } + +.fa-turn-up::before { + content: "\f3bf"; } + +.fa-level-up-alt::before { + content: "\f3bf"; } + +.sr-only, +.fa-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } + +.sr-only-focusable:not(:focus), +.fa-sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } +:root, :host { + --fa-style-family-brands: 'Font Awesome 6 Brands'; + --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; } + +@font-face { + font-family: 'Font Awesome 6 Brands'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +.fab, +.fa-brands { + font-weight: 400; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-redhat:before { + content: "\f7bc"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-cloudflare:before { + content: "\e07d"; } + +.fa-ups:before { + content: "\f7e0"; } + +.fa-pixiv:before { + content: "\e640"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-stackpath:before { + content: "\f842"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-guilded:before { + content: "\e07e"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-square-js:before { + content: "\f3b9"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-orcid:before { + content: "\f8d2"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-invision:before { + content: "\f7b0"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-jxl:before { + content: "\e67b"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-unity:before { + content: "\e049"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-square-reddit:before { + content: "\f1a2"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-square-font-awesome:before { + content: "\e5ad"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-brave:before { + content: "\e63c"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-square-instagram:before { + content: "\e055"; } + +.fa-instagram-square:before { + content: "\e055"; } + +.fa-battle-net:before { + content: "\f835"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-square-hacker-news:before { + content: "\f3af"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-threads:before { + content: "\e618"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-square-snapchat:before { + content: "\f2ad"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-artstation:before { + content: "\f77a"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-sourcetree:before { + content: "\f7d3"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-diaspora:before { + content: "\f791"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-square-font-awesome-stroke:before { + content: "\f35c"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-atlassian:before { + content: "\f77b"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-chromecast:before { + content: "\f838"; } + +.fa-evernote:before { + content: "\f839"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-watchman-monitoring:before { + content: "\e087"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-git-alt:before { + content: "\f841"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-square-viadeo:before { + content: "\f2aa"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-centos:before { + content: "\f789"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-opensuse:before { + content: "\e62b"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-square-dribbble:before { + content: "\f397"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-node:before { + content: "\f419"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-debian:before { + content: "\e60b"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-instalod:before { + content: "\e081"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-square-twitter:before { + content: "\f081"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-golang:before { + content: "\e40f"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-square-kickstarter:before { + content: "\f3bb"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-uncharted:before { + content: "\e084"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-square-youtube:before { + content: "\f431"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wpressr:before { + content: "\f3e4"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-nfc-directional:before { + content: "\e530"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-fedora:before { + content: "\f798"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-meta:before { + content: "\e49b"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-square-letterboxd:before { + content: "\e62e"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-confluence:before { + content: "\f78d"; } + +.fa-shoelace:before { + content: "\e60c"; } + +.fa-mdb:before { + content: "\f8ca"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-unsplash:before { + content: "\e07c"; } + +.fa-yarn:before { + content: "\f7e3"; } + +.fa-square-steam:before { + content: "\f1b7"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-500px:before { + content: "\f26e"; } + +.fa-square-vimeo:before { + content: "\f194"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-flag:before { + content: "\f2b4"; } + +.fa-font-awesome-logo-full:before { + content: "\f2b4"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-hive:before { + content: "\e07f"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-padlet:before { + content: "\e4a0"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-square-github:before { + content: "\f092"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-fedex:before { + content: "\f797"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-shopify:before { + content: "\e057"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-square-threads:before { + content: "\e619"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-swift:before { + content: "\f8e1"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-google-scholar:before { + content: "\e63b"; } + +.fa-square-gitlab:before { + content: "\e5ae"; } + +.fa-gitlab-square:before { + content: "\e5ae"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-square-odnoklassniki:before { + content: "\f264"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-hashnode:before { + content: "\e499"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-itch-io:before { + content: "\f83a"; } + +.fa-umbraco:before { + content: "\f8e8"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-ubuntu:before { + content: "\f7df"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-dhl:before { + content: "\f790"; } + +.fa-square-pinterest:before { + content: "\f0d3"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-signal-messenger:before { + content: "\e663"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-dailymotion:before { + content: "\e052"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-bootstrap:before { + content: "\f836"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-nfc-symbol:before { + content: "\e531"; } + +.fa-mintbit:before { + content: "\e62f"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-speaker-deck:before { + content: "\f83c"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-brave-reverse:before { + content: "\e63d"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-square-google-plus:before { + content: "\f0d4"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-web-awesome:before { + content: "\e682"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-d-and-d-beyond:before { + content: "\f6ca"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-square-xing:before { + content: "\f169"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-usps:before { + content: "\f7e1"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-letterboxd:before { + content: "\e62d"; } + +.fa-symfony:before { + content: "\f83d"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-think-peaks:before { + content: "\f731"; } + +.fa-bilibili:before { + content: "\e3d9"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-x-twitter:before { + content: "\e61b"; } + +.fa-cotton-bureau:before { + content: "\f89e"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-42-group:before { + content: "\e080"; } + +.fa-innosoft:before { + content: "\e080"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-square-pied-piper:before { + content: "\e01e"; } + +.fa-pied-piper-square:before { + content: "\e01e"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-square-web-awesome-stroke:before { + content: "\e684"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-tiktok:before { + content: "\e07b"; } + +.fa-square-facebook:before { + content: "\f082"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-mixer:before { + content: "\e056"; } + +.fa-square-lastfm:before { + content: "\f203"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-mendeley:before { + content: "\f7b3"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-figma:before { + content: "\f799"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-cmplid:before { + content: "\e360"; } + +.fa-upwork:before { + content: "\e641"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-square-upwork:before { + content: "\e67c"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-deezer:before { + content: "\e077"; } + +.fa-raspberry-pi:before { + content: "\f7bb"; } + +.fa-jira:before { + content: "\f7b1"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-screenpal:before { + content: "\e570"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-microblog:before { + content: "\e01a"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-square-web-awesome:before { + content: "\e683"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-wirsindhandwerk:before { + content: "\e2d0"; } + +.fa-wsh:before { + content: "\e2d0"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-salesforce:before { + content: "\f83b"; } + +.fa-octopus-deploy:before { + content: "\e082"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-waze:before { + content: "\f83f"; } + +.fa-bluesky:before { + content: "\e671"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ab"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-rust:before { + content: "\e07a"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-square-behance:before { + content: "\f1b5"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-webflow:before { + content: "\e65c"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-space-awesome:before { + content: "\e5ac"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-square-git:before { + content: "\f1d2"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-square-tumblr:before { + content: "\f174"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-perbyte:before { + content: "\e083"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-bots:before { + content: "\e340"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-ideal:before { + content: "\e013"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-sketch:before { + content: "\f7c6"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-php:before { + content: "\f457"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-firefox-browser:before { + content: "\e007"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-suse:before { + content: "\f7d6"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-buffer:before { + content: "\f837"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-yammer:before { + content: "\f840"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-stubber:before { + content: "\e5c7"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f2c6"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-odysee:before { + content: "\e5c6"; } + +.fa-square-whatsapp:before { + content: "\f40c"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-edge-legacy:before { + content: "\e078"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f198"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-square-x-twitter:before { + content: "\e61a"; } + +.fa-reacteurope:before { + content: "\f75d"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f23a"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-sitrox:before { + content: "\e44a"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-airbnb:before { + content: "\f834"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-buy-n-large:before { + content: "\f8a6"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-canadian-maple-leaf:before { + content: "\f785"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-wodu:before { + content: "\e088"; } + +.fa-google-pay:before { + content: "\e079"; } + +.fa-intercom:before { + content: "\f7af"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-pix:before { + content: "\e43a"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Free'; + --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; } + +@font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } + +.far, +.fa-regular { + font-weight: 400; } +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Free'; + --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; } + +@font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 900; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +.fas, +.fa-solid { + font-weight: 900; } +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-display: block; + font-weight: 400; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-display: block; + font-weight: 900; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-display: block; + font-weight: 400; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); + unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype"); + unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; } diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/css/all.min.css b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/css/all.min.css new file mode 100644 index 0000000..45072b3 --- /dev/null +++ b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/css/all.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} +.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css new file mode 100644 index 0000000..45545ec --- /dev/null +++ b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css @@ -0,0 +1,30 @@ +.fa-tiny { + font-size: 0.5em; +} +.fa-scriptsize { + font-size: 0.7em; +} +.fa-footnotesize { + font-size: 0.8em; +} +.fa-small { + font-size: 0.9em; +} +.fa-normalsize { + font-size: 1em; +} +.fa-large { + font-size: 1.2em; +} +.fa-Large { + font-size: 1.5em; +} +.fa-LARGE { + font-size: 1.75em; +} +.fa-huge { + font-size: 2em; +} +.fa-Huge { + font-size: 2.5em; +} diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..1fbb1f7 Binary files /dev/null and b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf differ diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2 b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..5d28021 Binary files /dev/null and b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2 differ diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..549d68d Binary files /dev/null and b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf differ diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2 b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..18400d7 Binary files /dev/null and b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2 differ diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..bb2a869 Binary files /dev/null and b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf differ diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2 b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..758dd4f Binary files /dev/null and b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2 differ diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf new file mode 100644 index 0000000..8c5864c Binary files /dev/null and b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf differ diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2 b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 0000000..f94bec2 Binary files /dev/null and b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2 differ diff --git a/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/fontawesome.lua b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/fontawesome.lua new file mode 100644 index 0000000..f7eecae --- /dev/null +++ b/_extensions/drwater/social-share/_extensions/quarto-ext/fontawesome/fontawesome.lua @@ -0,0 +1,83 @@ +local function ensureLatexDeps() + quarto.doc.use_latex_package("fontawesome5") +end + +local function ensureHtmlDeps() + quarto.doc.add_html_dependency({ + name = 'fontawesome6', + version = '1.2.0', + stylesheets = { 'assets/css/all.min.css', 'assets/css/latex-fontsize.css' } + }) +end + +local function isEmpty(s) + return s == nil or s == '' +end + +local function isValidSize(size) + local validSizes = { + "tiny", + "scriptsize", + "footnotesize", + "small", + "normalsize", + "large", + "Large", + "LARGE", + "huge", + "Huge" + } + for _, v in ipairs(validSizes) do + if v == size then + return size + end + end + return "" +end + +return { + ["fa"] = function(args, kwargs) + local group = "solid" + local icon = pandoc.utils.stringify(args[1]) + if #args > 1 then + group = icon + icon = pandoc.utils.stringify(args[2]) + end + + local title = pandoc.utils.stringify(kwargs["title"]) + if not isEmpty(title) then + title = " title=\"" .. title .. "\"" + end + + local label = pandoc.utils.stringify(kwargs["label"]) + if isEmpty(label) then + label = " aria-label=\"" .. icon .. "\"" + else + label = " aria-label=\"" .. label .. "\"" + end + + local size = pandoc.utils.stringify(kwargs["size"]) + + -- detect html (excluding epub which won't handle fa) + if quarto.doc.is_format("html:js") then + ensureHtmlDeps() + if not isEmpty(size) then + size = " fa-" .. size + end + return pandoc.RawInline( + 'html', + "" + ) + -- detect pdf / beamer / latex / etc + elseif quarto.doc.is_format("pdf") then + ensureLatexDeps() + if isEmpty(isValidSize(size)) then + return pandoc.RawInline('tex', "\\faIcon{" .. icon .. "}") + else + return pandoc.RawInline('tex', "{\\" .. size .. "\\faIcon{" .. icon .. "}}") + end + else + return pandoc.Null() + end + end +} diff --git a/_extensions/drwater/social-share/social-share.css b/_extensions/drwater/social-share/social-share.css new file mode 100644 index 0000000..a88d40b --- /dev/null +++ b/_extensions/drwater/social-share/social-share.css @@ -0,0 +1,112 @@ +/*adapted from: https://www.remysheppard.com/blog/hugo-share-buttons/*/ +.social-share { + display: flex; + flex-direction: row; + justify-content: left; + flex-wrap: wrap; +} + +.social-share a { + border-radius: 25px; + padding: 0.25rem 0.5rem; + background: white; + border: 1px solid transparent; + transition: background ease 0.3s, color ease 0.3s; + margin-bottom: 1em; + margin-left: 0.5em; + text-decoration: none; +} + +.social-share a:before { + display: none; +} + +.social-share a.facebook { + border-color: #4267B2; + color: #4267B2; +} + +.social-share a.facebook:hover { + background: #4267B2; + color: white; +} + +.social-share a.twitter { + border-color: #1DA1F2; + color: #1DA1F2; +} + +.social-share a.twitter:hover { + background: #1DA1F2; + color: white; +} + +.social-share a.reddit { + border-color: #FF4500; + color: #FF4500; +} + +.social-share a.reddit:hover { + background: #FF4500; + color: white; +} + +.social-share a.stumbleupon { + border-color: #EB471D; + color: #EB471D; +} + +.social-share a.stumbleupon:hover { + background: #EB471D; + color: white; +} + +.social-share a.tumblr { + border-color: #35465C; + color: #35465C; +} + +.social-share a.tumblr:hover { + background: #35465C; + color: white; +} + +.social-share a.linkedin { + border-color: #2867B2; + color: #2867B2; +} + +.social-share a.linkedin:hover { + background: #2867B2; + color: white; +} + +.social-share a.email { + border-color: #00A4EF; + color: #00A4EF; +} + +.social-share a.email:hover { + background: #00A4EF; + color: white; +} + +.social-share a.mastodon { + border-color: #6364FF; + color: #6364FF; +} + +.social-share a.mastodon:hover { + background: #6364FF; + color: white; +} + +.social-share a.bsky { + border-color: #0A7AFF; + color: #0A7AFF; +} + +.social-share a.bsky:hover { + border-color: #0A7AFF; + color: white; +} \ No newline at end of file diff --git a/_extensions/drwater/social-share/social-share.lua b/_extensions/drwater/social-share/social-share.lua new file mode 100644 index 0000000..278a1cc --- /dev/null +++ b/_extensions/drwater/social-share/social-share.lua @@ -0,0 +1,97 @@ +local function ensureHtmlDeps() + quarto.doc.addHtmlDependency({ + name = 'social-share', + version = '1.0.0', + stylesheets = { + 'social-share.css', + '_extensions/quarto-ext/fontawesome/assets/css/all.min.css' + } + }) +end + +function Meta(m) + ensureHtmlDeps() + local share_start = '