diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..f0b9598e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +node_modules +.github +.next diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..239ea503 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +# Step 1: Use a Node.js base image +FROM node:latest as builder + +# Set the working directory +WORKDIR /app + +# Copy package.json and package-lock.json files +COPY package*.json ./ + +# Install dependencies +RUN npm install + +# Copy the rest of your app's source code +COPY . . + +# Build your Next.js application +RUN npm run build + +# Step 2: Set up a LaTeX environment +# Use a base image that includes a minimal TeX distribution like TinyTeX +# Start from a LaTeX base image that uses Debian +FROM texlive/texlive:latest + +# Install Node.js +RUN apt-get update && \ + apt-get install nodejs -y && \ + apt-get install npm -y + +# Copy the built Next.js application from the builder stage +COPY --from=builder /app/.next .next +COPY --from=builder /app/node_modules node_modules +COPY --from=builder /app/package.json package.json +COPY --from=builder /app/public public + +# Expose the port the app runs on +EXPOSE 4006 + +# Set the command to start your app +CMD ["npm", "run", "start", "--", "-p", "4006"] + diff --git a/package-lock.json b/package-lock.json index a9688862..3ca976bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,11 @@ "version": "3.0.0", "dependencies": { "archiver": "^5.3.1", + "babel-runtime": "^6.26.0", "common-tags": "^1.8.2", + "core-js": "^3.33.3", "fs-extra": "^10.1.0", + "fslightbox-react": "^1.7.6", "jotai": "^1.7.0", "next": "^13.5.4", "node-latex": "^3.1.0", @@ -19,8 +22,10 @@ "react-dom": "^18.2.0", "react-hook-form": "^7.31.3", "react-icons": "^4.4.0", + "react-is": "^18.2.0", "react-pdf": "^5.7.2", "react-tooltip": "^4.2.21", + "sharp": "^0.33.0", "styled-components": "^5.3.3", "styled-reset": "^4.4.1" }, @@ -28,6 +33,7 @@ "@types/archiver": "^5.3.1", "@types/common-tags": "^1.8.1", "@types/fs-extra": "^9.0.13", + "@types/fslightbox-react": "^1.7.6", "@types/node": "16.11.12", "@types/react": "17.0.37", "@types/react-pdf": "^5.0.9", @@ -52,19 +58,6 @@ "node": ">=0.10.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -74,66 +67,6 @@ "@babel/highlight": "^7.10.4" } }, - "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", - "peer": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", - "peer": true, - "dependencies": { - "@babel/highlight": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", @@ -159,49 +92,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "peer": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "peer": true - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", @@ -244,25 +134,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", - "peer": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", @@ -271,18 +142,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", @@ -310,29 +169,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", - "peer": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/highlight": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", @@ -522,6 +358,15 @@ "node": ">=6.9.0" } }, + "node_modules/@emnapi/runtime": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.44.0.tgz", + "integrity": "sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emotion/is-prop-valid": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", @@ -618,6 +463,437 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.0.tgz", + "integrity": "sha512-070tEheekI1LJWTGPC9WlQEa5UoKTXzzlORBHMX4TbfUxMiL336YHR8vBEUNsjse0RJCX8dZ4ZXwT595aEF1ug==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.0.tgz", + "integrity": "sha512-pu/nvn152F3qbPeUkr+4e9zVvEhD3jhwzF473veQfMPkOYo9aoWXSfdZH/E6F+nYC3qvFjbxbvdDbUtEbghLqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.0.tgz", + "integrity": "sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.0.tgz", + "integrity": "sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.0.tgz", + "integrity": "sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.0.tgz", + "integrity": "sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.0.tgz", + "integrity": "sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.0.tgz", + "integrity": "sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.0.tgz", + "integrity": "sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.0.tgz", + "integrity": "sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.0.tgz", + "integrity": "sha512-4horD3wMFd5a0ddbDY8/dXU9CaOgHjEHALAddXgafoR5oWq5s8X61PDgsSeh4Qupsdo6ycfPPSSNBrfVQnwwrg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.0.tgz", + "integrity": "sha512-dcomVSrtgF70SyOr8RCOCQ8XGVThXwe71A1d8MGA+mXEVRJ/J6/TrCbBEJh9ddcEIIsrnrkolaEvYSHqVhswQw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.0.tgz", + "integrity": "sha512-TiVJbx38J2rNVfA309ffSOB+3/7wOsZYQEOlKqOUdWD/nqkjNGrX+YQGz7nzcf5oy2lC+d37+w183iNXRZNngQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.0.tgz", + "integrity": "sha512-PaZM4Zi7/Ek71WgTdvR+KzTZpBqrQOFcPe7/8ZoPRlTYYRe43k6TWsf4GVH6XKRLMYeSp8J89RfAhBrSP4itNA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.0.tgz", + "integrity": "sha512-1QLbbN0zt+32eVrg7bb1lwtvEaZwlhEsY1OrijroMkwAqlHqFj6R33Y47s2XUv7P6Ie1PwCxK/uFnNqMnkd5kg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.0.tgz", + "integrity": "sha512-CecqgB/CnkvCWFhmfN9ZhPGMLXaEBXl4o7WtA6U3Ztrlh/s7FUKX4vNxpMSYLIrWuuzjiaYdfU3+Tdqh1xaHfw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.0.tgz", + "integrity": "sha512-Hn4js32gUX9qkISlemZBUPuMs0k/xNJebUNl/L6djnU07B/HAA2KaxRVb3HvbU5fL242hLOcp0+tR+M8dvJUFw==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^0.44.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.0.tgz", + "integrity": "sha512-5HfcsCZi3l5nPRF2q3bllMVMDXBqEWI3Q8KQONfzl0TferFE5lnsIG0A1YrntMAGqvkzdW6y1Ci1A2uTvxhfzg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.0.tgz", + "integrity": "sha512-i3DtP/2ce1yKFj4OzOnOYltOEL/+dp4dc4dJXJBv6god1AFTcmkaA99H/7SwOmkCOBQkbVvA3lCGm3/5nDtf9Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -647,12 +923,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.4.tgz", - "integrity": "sha512-KE/SxsDqNs3rrWwFHcRh15ZLVFrI0YoZtgAdIyIq9k5hUNmiWRXXThPomIxHuL20sLdgzbDFyvkUMna14bvtrw==", - "peer": true - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -925,32 +1195,6 @@ "integrity": "sha512-20R/mDpKSPWdJs5TOpz3e7zqbeCNuMCPhV7Yndk9KU2Rbij2r5W4RzwDPkzC+2lzUqXYu9rFzTktCBnDjHuNQg==", "dev": true }, - "node_modules/@types/eslint": { - "version": "8.40.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.2.tgz", - "integrity": "sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ==", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "peer": true - }, "node_modules/@types/fs-extra": { "version": "9.0.13", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", @@ -960,6 +1204,15 @@ "@types/node": "*" } }, + "node_modules/@types/fslightbox-react": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@types/fslightbox-react/-/fslightbox-react-1.7.6.tgz", + "integrity": "sha512-OGKBjFwfJbA6rKa2o6VdfWirFNcIxqsdFS/YnGyaPDfearEI4tWRFHLYBvKhyn5jKffJi8aQ4eYF0GA4MLe4NQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -984,7 +1237,8 @@ "node_modules/@types/node": { "version": "16.11.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", + "dev": true }, "node_modules/@types/prop-types": { "version": "15.7.5", @@ -1199,195 +1453,37 @@ "@typescript-eslint/scope-manager": "5.60.1", "@typescript-eslint/types": "5.60.1", "@typescript-eslint/typescript-estree": "5.60.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "peer": true, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "peer": true - }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -1702,6 +1798,27 @@ "styled-components": ">= 2" } }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1786,38 +1903,6 @@ "node": ">=8" } }, - "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -1849,12 +1934,6 @@ "node": "*" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "peer": true - }, "node_modules/bundle-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", @@ -1946,25 +2025,27 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1975,14 +2056,16 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "peer": true + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "node_modules/common-tags": { "version": "1.8.2", @@ -2011,11 +2094,15 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "peer": true + "node_modules/core-js": { + "version": "3.33.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz", + "integrity": "sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, "node_modules/core-util-is": { "version": "1.0.3", @@ -2181,6 +2268,14 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2212,12 +2307,6 @@ "deprecated": "dommatrix is no longer maintained. Please use @thednp/dommatrix.", "dev": true }, - "node_modules/electron-to-chromium": { - "version": "1.4.447", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.447.tgz", - "integrity": "sha512-sxX0LXh+uL41hSJsujAN86PjhrV/6c79XmpY0TvjZStV6VxIgarf8SRkUoUTuYmFcZQTemsoqo8qXOGw5npWfw==", - "peer": true - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -2244,6 +2333,7 @@ "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -2312,12 +2402,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "peer": true - }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -2358,15 +2442,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2746,6 +2821,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -2758,6 +2834,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -2868,6 +2945,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -2879,6 +2957,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -2892,15 +2971,6 @@ "node": ">=0.10.0" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/execa": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", @@ -3059,6 +3129,16 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "node_modules/fslightbox-react": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/fslightbox-react/-/fslightbox-react-1.7.6.tgz", + "integrity": "sha512-7LN2GZRLHo2vZGKdH+BZDJUoUDkCRCLlZ5hOwtLtZplmGZQ9nqzpG54cTax7XNjbYGTWLT6BHdMiL5zOEhiRlA==", + "peerDependencies": { + "prop-types": ">=15.6.2", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3098,15 +3178,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", @@ -3296,6 +3367,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3468,6 +3540,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -3773,35 +3850,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/jotai": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/jotai/-/jotai-1.13.1.tgz", @@ -3888,12 +3936,6 @@ "node": ">=4" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "peer": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4008,15 +4050,6 @@ "node": ">= 0.8.0" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -4087,7 +4120,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -4133,7 +4165,8 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", @@ -4157,27 +4190,6 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -4244,12 +4256,6 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "peer": true - }, "node_modules/next": { "version": "13.5.4", "resolved": "https://registry.npmjs.org/next/-/next-13.5.4.tgz", @@ -4329,12 +4335,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "peer": true - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4735,15 +4735,6 @@ } ] }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -4793,8 +4784,7 @@ "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "peer": true + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/react-pdf": { "version": "5.7.2", @@ -5181,7 +5171,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -5192,20 +5181,50 @@ "node": ">=10" } }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, + "node_modules/sharp": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.0.tgz", + "integrity": "sha512-99DZKudjm/Rmz+M0/26t4DKpXyywAOJaayGS9boEn7FvgtG0RYBi46uPE2c+obcJRtA3AZa0QwJot63gJQ1F0Q==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + }, + "engines": { + "libvips": ">=8.15.0", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.0", + "@img/sharp-darwin-x64": "0.33.0", + "@img/sharp-libvips-darwin-arm64": "1.0.0", + "@img/sharp-libvips-darwin-x64": "1.0.0", + "@img/sharp-libvips-linux-arm": "1.0.0", + "@img/sharp-libvips-linux-arm64": "1.0.0", + "@img/sharp-libvips-linux-s390x": "1.0.0", + "@img/sharp-libvips-linux-x64": "1.0.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0", + "@img/sharp-libvips-linuxmusl-x64": "1.0.0", + "@img/sharp-linux-arm": "0.33.0", + "@img/sharp-linux-arm64": "0.33.0", + "@img/sharp-linux-s390x": "0.33.0", + "@img/sharp-linux-x64": "0.33.0", + "@img/sharp-linuxmusl-arm64": "0.33.0", + "@img/sharp-linuxmusl-x64": "0.33.0", + "@img/sharp-wasm32": "0.33.0", + "@img/sharp-win32-ia32": "0.33.0", + "@img/sharp-win32-x64": "0.33.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5247,6 +5266,14 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5273,15 +5300,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -5290,16 +5308,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -5650,6 +5658,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, "engines": { "node": ">=6" } @@ -5691,70 +5700,6 @@ "rimraf": "bin.js" } }, - "node_modules/terser": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz", - "integrity": "sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5972,36 +5917,6 @@ "node": ">=8" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6050,83 +5965,6 @@ "node": ">= 8" } }, - "node_modules/webpack": { - "version": "5.88.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", - "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6194,8 +6032,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/zip-stream": { "version": "4.1.0", diff --git a/package.json b/package.json index 71ef867d..11116029 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,11 @@ }, "dependencies": { "archiver": "^5.3.1", + "babel-runtime": "^6.26.0", "common-tags": "^1.8.2", + "core-js": "^3.33.3", "fs-extra": "^10.1.0", + "fslightbox-react": "^1.7.6", "jotai": "^1.7.0", "next": "^13.5.4", "node-latex": "^3.1.0", @@ -22,8 +25,10 @@ "react-dom": "^18.2.0", "react-hook-form": "^7.31.3", "react-icons": "^4.4.0", + "react-is": "^18.2.0", "react-pdf": "^5.7.2", "react-tooltip": "^4.2.21", + "sharp": "^0.33.0", "styled-components": "^5.3.3", "styled-reset": "^4.4.1" }, @@ -31,6 +36,7 @@ "@types/archiver": "^5.3.1", "@types/common-tags": "^1.8.1", "@types/fs-extra": "^9.0.13", + "@types/fslightbox-react": "^1.7.6", "@types/node": "16.11.12", "@types/react": "17.0.37", "@types/react-pdf": "^5.0.9", diff --git a/public/lib/templates/constants.ts b/public/lib/templates/constants.ts new file mode 100644 index 00000000..5703ef18 --- /dev/null +++ b/public/lib/templates/constants.ts @@ -0,0 +1,13 @@ +export const TEMPLATE1 = 1 +export const TEMPLATE2 = 2 +export const TEMPLATE3 = 3 +export const TEMPLATE4 = 4 +export const TEMPLATE5 = 5 +export const TEMPLATE6 = 6 +export const TEMPLATE7 = 7 +export const TEMPLATE8 = 8 +export const TEMPLATE9 = 9 +export const TEMPLATE10 = 10 + +export const NEWLINE = '\\\\' +export const WHITESPACE = '\\ ' diff --git a/public/lib/templates/template1/index.ts b/public/lib/templates/template1/index.ts new file mode 100644 index 00000000..44ad9843 --- /dev/null +++ b/public/lib/templates/template1/index.ts @@ -0,0 +1,374 @@ +import { stripIndent, source } from 'common-tags' +import { WHITESPACE } from '../constants' +import { FormValues, Generator } from '../../../types' + +const generator: Generator = { + profileSection(basics) { + if (!basics) { + return '' + } + + const { name, email, phone, location, website } = basics + const address = location?.address || '' + + let line1 = name ? `{\\Huge \\scshape {${name}}}` : '' + let line2 = [address, email, phone, website] + .filter(Boolean) + .join(' $\\cdot$ ') + + if (line1 && line2) { + line1 += '\\\\' + line2 += '\\\\' + } + + return stripIndent` + %==== Profile ====% + \\vspace*{-10pt} + \\begin{center} + ${line1} + ${line2} + \\end{center} + ` + }, + + educationSection(education, heading) { + if (!education) { + return '' + } + + return source` + %==== Education ====% + \\header{${heading || 'Education'}} + ${education.map((school) => { + const { + institution, + location, + studyType, + area, + score, + startDate, + endDate + } = school + + let line1 = '' + let line2 = '' + + if (institution) { + line1 += `\\textbf{${institution}}` + } + + if (location) { + line1 += `\\hfill ${location}` + } + + if (studyType) { + line2 += studyType + } + + if (area) { + line2 += studyType ? ` ${area}` : `Degree in ${area}` + } + + if (score) { + line2 += ` \\textit{GPA: ${score}}` + } + + if (startDate || endDate) { + const gradLine = `${startDate || ''} - ${endDate || ''}` + line2 += line2 ? ` \\hfill ${gradLine}` : gradLine + } + + if (line1) { + line1 += '\\\\' + } + + if (line2) { + line2 += '\\\\' + } + + return stripIndent` + ${line1} + ${line2.trim()} + \\vspace{2mm} + ` + })} + ` + }, + + workSection(work, heading) { + if (!work) { + return '' + } + + return source` + %==== Experience ====% + \\header{${heading || 'Experience'}} + \\vspace{1mm} + + ${work.map((job) => { + const { company, position, location, startDate, endDate, highlights } = job + + let line1 = '' + let line2 = '' + let highlightLines = '' + + if (company) { + line1 += `\\textbf{${company}}` + } + + if (location) { + line1 += ` \\hfill ${location}` + } + + if (position) { + line2 += `\\textit{${position}}` + } + + if (startDate && endDate) { + line2 += ` \\hfill ${startDate} - ${endDate}` + } else if (startDate) { + line2 += ` \\hfill ${startDate} - Present` + } else if (endDate) { + line2 += ` \\hfill ${endDate}` + } + + if (line1) line1 += '\\\\' + if (line2) line2 += '\\\\' + + if (highlights) { + highlightLines = source` + \\vspace{-1mm} + \\begin{itemize} \\itemsep 1pt + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + } + + return stripIndent` + ${line1} + ${line2} + ${highlightLines} + ` + })} + ` + }, + + skillsSection(skills, heading) { + if (!skills) { + return '' + } + + return source` + \\header{${heading || 'Skills'}} + \\begin{tabular}{ l l } + ${skills.map((skill) => { + const { name = 'Misc', keywords = [] } = skill + return `${name}: & ${keywords.join(', ')} \\\\` + })} + \\end{tabular} + \\vspace{2mm} + ` + }, + + projectsSection(projects, heading) { + if (!projects) { + return '' + } + + return source` + \\header{${heading || 'Projects'}} + ${projects.map((project) => { + if (Object.keys(project).length === 0) { + return '' + } + + const { name, highlights, keywords, url } = project + + let line1 = '' + let highlightLines = '' + + if (name) { + line1 += `{\\textbf{${name}}}` + } + + if (keywords) { + line1 += ` {\\sl ${keywords.join(', ')}} ` + } + + if (url) { + line1 += `\\hfill ${url}` + } + + if (highlights && highlights.length > 0) { + highlightLines = source` + \\vspace{-1mm} + \\begin{itemize} \\itemsep 1pt + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + if (line1) line1 += '\\\\' // Only add line break if line1 exists + } + + return stripIndent` + ${line1} + ${highlightLines} + \\vspace*{2mm} + ` + })} + ` + }, + + awardsSection(awards, heading) { + if (!awards) { + return '' + } + + return source` + \\header{${heading || 'Awards'}} + ${awards.map((award) => { + const { title, summary, date, awarder } = award + + let line1 = '' + let line2 = summary || '' + + if (title) { + line1 += `\\textbf{${title}}` + } + + if (awarder) { + line1 += ` \\hfill ${awarder}` + } + + if (date) { + line2 += ` \\hfill ${date}` + } + + if (line1) line1 += '\\\\' + if (line2) line2 += '\\\\' + + return stripIndent` + ${line1} + ${line2} + \\vspace*{2mm} + ` + })} + ` + }, + + resumeHeader() { + return stripIndent` + %\\renewcommand{\\encodingdefault}{cg} + %\\renewcommand{\\rmdefault}{lgrcmr} + + \\def\\bull{\\vrule height 0.8ex width .7ex depth -.1ex } + + % DEFINITIONS FOR RESUME %%%%%%%%%%%%%%%%%%%%%%% + + \\newcommand{\\area} [2] { + \\vspace*{-9pt} + \\begin{verse} + \\textbf{#1} #2 + \\end{verse} + } + + \\newcommand{\\lineunder} { + \\vspace*{-8pt} \\\\ + \\hspace*{-18pt} \\hrulefill \\\\ + } + + \\newcommand{\\header} [1] { + {\\hspace*{-18pt}\\vspace*{6pt} \\textsc{#1}} + \\vspace*{-6pt} \\lineunder + } + + \\newcommand{\\employer} [3] { + { \\textbf{#1} (#2)\\\\ \\underline{\\textbf{\\emph{#3}}}\\\\ } + } + + \\newcommand{\\contact} [3] { + \\vspace*{-10pt} + \\begin{center} + {\\Huge \\scshape {#1}}\\\\ + #2 \\\\ #3 + \\end{center} + \\vspace*{-8pt} + } + + \\newenvironment{achievements}{ + \\begin{list} + {$\\bullet$}{\\topsep 0pt \\itemsep -2pt}}{\\vspace*{4pt} + \\end{list} + } + + \\newcommand{\\schoolwithcourses} [4] { + \\textbf{#1} #2 $\\bullet$ #3\\\\ + #4 \\\\ + \\vspace*{5pt} + } + + \\newcommand{\\school} [4] { + \\textbf{#1} #2 $\\bullet$ #3\\\\ + #4 \\\\ + } + % END RESUME DEFINITIONS %%%%%%%%%%%%%%%%%%%%%%% + ` + } +} + +function template1(values: FormValues) { + const { headings } = values + + return stripIndent` + \\documentclass[a4paper]{article} + \\usepackage{fullpage} + \\usepackage{amsmath} + \\usepackage{amssymb} + \\usepackage{textcomp} + \\usepackage[utf8]{inputenc} + \\usepackage[T1]{fontenc} + \\textheight=10in + \\pagestyle{empty} + \\raggedright + \\usepackage[left=0.8in,right=0.8in,bottom=0.8in,top=0.8in]{geometry} + + ${generator.resumeHeader()} + + \\begin{document} + \\vspace*{-40pt} + + ${values.sections + .map((section) => { + switch (section) { + case 'profile': + return generator.profileSection(values.basics) + + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection(values.projects, headings.projects) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n\n')} + + ${WHITESPACE} + \\end{document} + ` +} + +export default template1 diff --git a/public/lib/templates/template2/index.ts b/public/lib/templates/template2/index.ts new file mode 100644 index 00000000..2103ddf9 --- /dev/null +++ b/public/lib/templates/template2/index.ts @@ -0,0 +1,337 @@ +import { stripIndent, source } from 'common-tags' +import { WHITESPACE } from '../constants' +import type { FormValues, Generator } from '../../../types' + +const generator: Generator = { + profileSection(basics) { + if (!basics) { + return '' + } + + const { name, email, phone, location = {}, website } = basics + + let nameLine = '' + + if (name) { + const names = name.split(' ') + let nameStart = '' + let nameEnd = '' + + if (names.length === 1) { + nameStart = names[0] + } else { + nameStart = names[0] + nameEnd = names.slice(1, names.length).join(' ') + } + + nameLine = `\\headerfirstnamestyle{${nameStart}} \\headerlastnamestyle{${nameEnd}} \\\\` + } + + const emailLine = email ? `{\\faEnvelope\\ ${email}}` : '' + const phoneLine = phone ? `{\\faMobile\\ ${phone}}` : '' + const addressLine = location.address + ? `{\\faMapMarker\\ ${location.address}}` + : '' + const websiteLine = website ? `{\\faLink\\ ${website}}` : '' + const info = [emailLine, phoneLine, addressLine, websiteLine] + .filter(Boolean) + .join(' | ') + + return stripIndent` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Profile + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\begin{center} + ${nameLine} + \\vspace{2mm} + ${info} + \\end{center} + ` + }, + + educationSection(education, heading) { + if (!education) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Education + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\cvsection{${heading || 'Education'}} + \\begin{cventries} + ${education.map((school) => { + const { + institution, + location, + area, + studyType, + score, + startDate, + endDate + } = school + + let degreeLine + + if (studyType && area) { + degreeLine = `${studyType} in ${area}` + } else if (studyType || area) { + degreeLine = studyType || area + } + + let dateRange + + if (startDate && endDate) { + dateRange = `${startDate} – ${endDate}` + } else if (startDate) { + dateRange = `${startDate} – Present` + } else { + dateRange = endDate + } + + return stripIndent` + \\cventry + {${degreeLine || ''}} + {${institution || ''}} + {${location || ''}} + {${dateRange || ''}} + {${score ? `GPA: ${score}` : ''}} + ` + })} + \\end{cventries} + + \\vspace{-2mm} + ` + }, + + workSection(work, heading) { + if (!work) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Experience + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\cvsection{${heading || 'Experience'}} + \\begin{cventries} + ${work.map(job => { + const { + company, + position, + location, + startDate, + endDate, + highlights + } = job + + let dateRange = '' + let dutyLines = '' + + if (startDate && endDate) { + dateRange = `${startDate} – ${endDate}` + } else if (startDate) { + dateRange = `${startDate} – Present` + } else { + dateRange = endDate || '' + } + + if (highlights) { + dutyLines = source` + \\begin{cvitems} + ${highlights.map(duty => `\\item {${duty}}`)} + \\end{cvitems} + ` + } + + const final = stripIndent` + \\cventry + {${position || ''}} + {${company || ''}} + {${location || ''}} + {${dateRange || ''}} + {${dutyLines}} + ` + return final + + })} + \\end{cventries} + ` + }, + + skillsSection(skills, heading) { + if (!skills) { + return '' + } + + return source` + \\cvsection{${heading || 'Skills'}} + \\begin{cventries} + \\cventry + {} + {\\def\\arraystretch{1.15}{\\begin{tabular}{ l l } + ${skills.map((skill) => { + const { name, keywords = [] } = skill + const nameLine = name ? `${name}: ` : '' + const detailsLine = `{\\skill{ ${keywords.join(', ') || ''}}}` + + return `${nameLine} & ${detailsLine} \\\\` + })} + \\end{tabular}}} + {} + {} + {} + \\end{cventries} + + \\vspace{-7mm} + ` + }, + + projectsSection(projects, heading) { + if (!projects) { + return '' + } + + return source` + \\cvsection{${heading || 'Projects'}} + \\begin{cventries} + ${projects.map((project) => { + const { name, highlights = [], keywords = [], url } = project + + const bulletPoints = highlights + .map((highlight) => `\\item {${highlight}}`) + .join('\n') + + // Ensure that all LaTeX commands are properly closed + return stripIndent` + \\cventry + {${name || ''}} % Project Name + {${keywords.join(', ') || ''}} % Keywords + {${url || ''}} % URL + {} % Empty field for compatibility + {} + \\begin{itemize} + ${bulletPoints} + \\end{itemize} + \\vspace{-5mm} + ` + })} + \\end{cventries} + ` + }, + + awardsSection(awards, heading) { + if (!awards) { + return '' + } + + return source` + \\cvsection{${heading || 'Awards'}} + \\begin{cvhonors} + ${awards.map((award) => { + const { title, summary, date, awarder } = award + + return stripIndent` + \\cvhonor + {${title || ''}} + {${summary || ''}} + {${awarder || ''}} + {${date || ''}} + ` + })} + \\end{cvhonors} + ` + }, + + resumeHeader() { + return stripIndent` + %!TEX TS-program = xelatex + %!TEX encoding = UTF-8 Unicode + % Awesome CV LaTeX Template + % + % This template has been downloaded from: + % https://github.com/posquit0/Awesome-CV + % + % Author: + % Claud D. Park + % http://www.posquit0.com + % + % Template license: + % CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0/) + % + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Configuration + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% Themes: Awesome-CV + \\documentclass[]{awesome-cv} + \\usepackage{textcomp} + %%% Override a directory location for fonts(default: 'fonts/') + \\fontdir[fonts/] + + %%% Configure a directory location for sections + \\newcommand*{\\sectiondir}{resume/} + + %%% Override color + % Awesome Colors: awesome-emerald, awesome-skyblue, awesome-red, awesome-pink, awesome-orange + % awesome-nephritis, awesome-concrete, awesome-darknight + %% Color for highlight + % Define your custom color if you don't like awesome colors + \\colorlet{awesome}{awesome-red} + %\\definecolor{awesome}{HTML}{CA63A8} + %% Colors for text + %\\definecolor{darktext}{HTML}{414141} + %\\definecolor{text}{HTML}{414141} + %\\definecolor{graytext}{HTML}{414141} + %\\definecolor{lighttext}{HTML}{414141} + + %%% Override a separator for social informations in header(default: ' | ') + %\\headersocialsep[\\quad\\textbar\\quad] + ` + } +} + +function template2(values: FormValues) { + const { headings = {} } = values + + return stripIndent` + \\errorcontextlines=5 + ${generator.resumeHeader()} + \\begin{document} + + ${values.sections + .map((section) => { + switch (section) { + case 'profile': + return generator.profileSection(values.basics) + + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection(values.projects, headings.projects) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n')} + ${WHITESPACE} + \\end{document} + ` +} + +export default template2 diff --git a/public/lib/templates/template2/inputs/awesome-cv.cls b/public/lib/templates/template2/inputs/awesome-cv.cls new file mode 100644 index 00000000..e864a273 --- /dev/null +++ b/public/lib/templates/template2/inputs/awesome-cv.cls @@ -0,0 +1,680 @@ +%% Start of file `awesome-cv.cls'. +% Awesome CV Class File +% +% This class has been downloaded from: +% https://github.com/posquit0/Awesome-CV +% +% Author: +% Claud D. Park +% http://www.posquit0.com +% +% Notes: +% 1) This class file defines the structure and layout of the template file (cv.tex, resume.tex). +% 2) It has been written in such a way that under most circumstances you +% should not need to edit it. +% +% Class license: +% LPPL v1.3c (http://www.latex-project.org/lppl) +% + + +%------------------------------------------------------------------------------- +% Identification +%------------------------------------------------------------------------------- +\ProvidesClass{awesome-cv}[2015/12/14 v1.3 Awesome Curriculum Vitae Class] +\NeedsTeXFormat{LaTeX2e} + + +%------------------------------------------------------------------------------- +% Class options +% +% (need to be done before the external package loading, for example because +% we need \paperwidth, \paperheight and \@ptsize to be defined before loading +% geometry and fancyhdr) +%------------------------------------------------------------------------------- +% Options for draft or final +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +% Inherit options of article +\DeclareOption*{ + \PassOptionsToClass{\CurrentOption}{article} +} +\ProcessOptions\relax +\LoadClass{article} + + +%------------------------------------------------------------------------------- +% 3rd party packages +%------------------------------------------------------------------------------- +% Needed to make fixed length table +\RequirePackage{array} +% Needed to handle list environment +\RequirePackage{enumitem} +% Needed to handle text alignment +\RequirePackage{ragged2e} +% Needed to configure page layout +\RequirePackage{geometry} +% Needed to make header & footer effeciently +\RequirePackage{fancyhdr} +% Needed to manage colors +\RequirePackage{xcolor} +% Needed to use \ifxetex-\else-\fi statement +\RequirePackage{ifxetex} +% Needed to use \if-\then-\else statement +\RequirePackage{xifthen} +% Needed to use a toolbox of programming tools +\RequirePackage{etoolbox} +% Needed to change line spacing in specific environment +\RequirePackage{setspace} +% Needed to manage fonts +\ifxetex + \RequirePackage[quiet]{fontspec} + % To support LaTeX quoting style + \defaultfontfeatures{Ligatures=TeX} +\else + \RequirePackage[T1]{fontenc} + % Replace by the encoding you are using + \RequirePackage[utf8]{inputenc} +\fi +% Needed to manage math fonts +\RequirePackage{unicode-math} +% Needed to use icons from font-awesome +% (https://github.com/posquit0/latex-fontawesome) +\RequirePackage{fontawesome} +% Needed to deal a paragraphs +\RequirePackage{parskip} +% Needed to deal hyperlink +\RequirePackage{hyperref} +\hypersetup{ + pdftitle={}, + pdfauthor={}, + pdfsubject={}, + pdfkeywords={}, + colorlinks=false, + allbordercolors=white +} + + +%------------------------------------------------------------------------------- +% Configuration for directory locations +%------------------------------------------------------------------------------- +% Configure a directory location for fonts(default: 'fonts/') +\newcommand*{\fontdir}[1][fonts/]{\def\@fontdir{#1}} +\fontdir + + +%------------------------------------------------------------------------------- +% Configuration for layout +%------------------------------------------------------------------------------- +%% Page Layout +% Configure page margins with geometry +\geometry{left=2.0cm, top=1.5cm, right=2.0cm, bottom=2.0cm, footskip=.5cm} + +%% Header & Footer +% Set offset to each header and offset +\fancyhfoffset{0em} +% Remove head rule +\renewcommand{\headrulewidth}{0pt} +% Clear all header & footer fields +\fancyhf{} +% Enable if you want to make header or footer using fancyhdr +\pagestyle{fancy} + + +%------------------------------------------------------------------------------- +% Configuration for colors +%------------------------------------------------------------------------------- +% Gray-scale colors +\definecolor{white}{HTML}{FFFFFF} +\definecolor{black}{HTML}{000000} +\definecolor{darkgray}{HTML}{333333} +\definecolor{gray}{HTML}{5D5D5D} +\definecolor{lightgray}{HTML}{999999} +% Basic colors +\definecolor{green}{HTML}{C2E15F} +\definecolor{orange}{HTML}{FDA333} +\definecolor{purple}{HTML}{D3A4F9} +\definecolor{red}{HTML}{FB4485} +\definecolor{blue}{HTML}{6CE0F1} +% Text colors +\definecolor{darktext}{HTML}{414141} +\colorlet{text}{darkgray} +\colorlet{graytext}{gray} +\colorlet{lighttext}{lightgray} +% Awesome colors +\definecolor{awesome-emerald}{HTML}{00A388} +\definecolor{awesome-skyblue}{HTML}{0395DE} +\definecolor{awesome-red}{HTML}{000000} +\definecolor{awesome-pink}{HTML}{EF4089} +\definecolor{awesome-orange}{HTML}{FF6138} +\definecolor{awesome-nephritis}{HTML}{27AE60} +\definecolor{awesome-concrete}{HTML}{95A5A6} +\definecolor{awesome-darknight}{HTML}{131A28} +\colorlet{awesome}{awesome-red} + +% Awesome section color +\newcounter{colorCounter} +\def\@sectioncolor#1#2#3{% + {% + \color{% + \ifcase\value{colorCounter}% + awesome\or% + awesome\or% + awesome\or% + awesome\or% + awesome\else% + awesome\fi% + } #1#2#3% + }% + \stepcounter{colorCounter}% +} + + +%------------------------------------------------------------------------------- +% Configuration for fonts +%------------------------------------------------------------------------------- +% Set font for header (default is Roboto) +\newfontfamily\headerfont[ + Path=\@fontdir, + UprightFont=*-Regular, + ItalicFont=*-Italic, + BoldFont=*-Bold, + BoldItalicFont=*-BoldItalic, +]{Roboto} + +\newfontfamily\headerfontlight[ + Path=\@fontdir, + UprightFont=*-Thin, + ItalicFont=*-ThinItalic, + BoldFont=*-Medium, + BoldItalicFont=*-MediumItalic, +]{Roboto} + +% Set font for footer (default is Source Sans Pro) +\newfontfamily\footerfont[ + Path=\@fontdir, + UprightFont=*-Regular, + ItalicFont=*-It, + BoldFont=*-Bold +]{SourceSansPro} + +% Set font for body (default is Source Sans Pro) +\newfontfamily\bodyfont[ + Path=\@fontdir, + UprightFont=*-Regular, + ItalicFont=*-It, + BoldFont=*-Bold, + BoldItalicFont=*-BoldIt +]{SourceSansPro} + +\newfontfamily\bodyfontlight[ + Path=\@fontdir, + UprightFont=*-Light, + ItalicFont=*-LightIt, + BoldFont=*-Semibold, + BoldItalicFont=*-SemiboldIt +]{SourceSansPro} + + +%------------------------------------------------------------------------------- +% Configuration for styles +%------------------------------------------------------------------------------- +% Configure styles for each CV elements +% For fundamental structures +\newcommand*{\headerfirstnamestyle}[1]{{\fontsize{32pt}{1em}\headerfontlight\color{graytext} #1}} +\newcommand*{\headerlastnamestyle}[1]{{\fontsize{32pt}{1em}\headerfont\bfseries\color{text} #1}} +\newcommand*{\headerpositionstyle}[1]{{\fontsize{7.6pt}{1em}\bodyfont\scshape\color{awesome} #1}} +\newcommand*{\headeraddressstyle}[1]{{\fontsize{8pt}{1em}\headerfont\itshape\color{lighttext} #1}} +\newcommand*{\headersocialstyle}[1]{{\fontsize{6.8pt}{1em}\headerfont\color{text} #1}} +\newcommand*{\headerquotestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\itshape\color{darktext} #1}} +\newcommand*{\footerstyle}[1]{{\fontsize{8pt}{1em}\footerfont\scshape\color{lighttext} #1}} +\newcommand*{\sectionstyle}[1]{{\fontsize{16pt}{1em}\bodyfont\bfseries\color{text}\@sectioncolor #1}} +\newcommand*{\subsectionstyle}[1]{{\fontsize{12pt}{1em}\bodyfont\scshape\textcolor{text}{#1}}} + +% For elements of entry +\newcommand*{\entrytitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}} +\newcommand*{\entrypositionstyle}[1]{{\fontsize{8pt}{1em}\bodyfont\scshape\color{graytext} #1}} +\newcommand*{\entrydatestyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\slshape\color{graytext} #1}} +\newcommand*{\entrylocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}} +\newcommand*{\descriptionstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text} #1}} +\newcommand*{\skill}[1]{{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text} \textnormal{#1}}} + +% For elements of subentry +\newcommand*{\subentrytitlestyle}[1]{{\fontsize{8pt}{1em}\bodyfont\mdseries\color{graytext} #1}} +\newcommand*{\subentrypositionstyle}[1]{{\fontsize{7pt}{1em}\bodyfont\scshape\color{graytext} #1}} +\newcommand*{\subentrydatestyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{graytext} #1}} +\newcommand*{\subentrylocationstyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{awesome} #1}} +\newcommand*{\subdescriptionstyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\upshape\color{text} #1}} + +% For elements of honor +\newcommand*{\honortitlestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}} +\newcommand*{\honorpositionstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\bfseries\color{darktext} #1}} +\newcommand*{\honordatestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}} +\newcommand*{\honorlocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}} + +% For elements of skill +\newcommand*{\skilltypestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}} +\newcommand*{\skillsetstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\color{text} #1}} + +% For elements of the cover letter +\newcommand*{\paragraphstyle}[1]{{\fontsize{14pt}{1em}\bodyfont\bfseries\color{text}\@sectioncolor #1}} +\newcommand*{\recipientaddressstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\scshape\color{graytext} #1}} +\newcommand*{\recipienttitlestyle}[1]{{\fontsize{11pt}{1em}\bodyfont\bfseries\color{darktext} #1}} +\newcommand*{\lettertitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\bfseries\color{darktext} \underline{#1}}} +\newcommand*{\letterdatestyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{graytext} #1}} +\newcommand*{\lettertextstyle}{\fontsize{10pt}{1.4em}\bodyfontlight\upshape\color{graytext}} +\newcommand*{\letternamestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}} +\newcommand*{\letterenclosurestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\slshape\color{lighttext} #1}} + + +%------------------------------------------------------------------------------- +% Commands for personal information +%------------------------------------------------------------------------------- +% Define writer's name +% Usage: \name{}{} +% Usage: \firstname{} +% Usage: \lastname{} +% Usage: \familyname{} +\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}} +\newcommand*{\firstname}[1]{\def\@firstname{#1}} +\newcommand*{\lastname}[1]{\def\@lastname{#1}} +\newcommand*{\familyname}[1]{\def\@lastname{#1}} +\def\@familyname{\@lastname} + +% Define writer's address +% Usage: \address{
} +\newcommand*{\address}[1]{\def\@address{#1}} + +% Define writer's position +% Usage: \name{} +\newcommand*{\position}[1]{\def\@position{#1}} + +% Defines writer's mobile (optional) +% Usage: \mobile{} +\newcommand*{\mobile}[1]{\def\@mobile{#1}} + +% Defines writer's email (optional) +% Usage: \email{} +\newcommand*{\email}[1]{\def\@email{#1}} + +% Defines writer's link (optional) +% Usage: \link{} +\newcommand*{\link}[1]{\def\@link{#1}} + +% Defines writer's github (optional) +% Usage: \github{} +\newcommand*{\github}[1]{\def\@github{#1}} + +% Defines writer's github (optional) +% Usage: \github{} +\newcommand*{\location}[1]{\def\@location{#1}} + +% Defines writer's linked-in (optional) +% Usage: \linkedin{} +\newcommand*{\linkedin}[1]{\def\@linkedin{#1}} + +% Defines writer's stackoverflow profile (optional) +% Usage: \stackoverflow{}{} +% e.g.https://stackoverflow.com/users/123456/sam-smith +% would be \stackoverflow{123456}{sam-smith} +\newcommand*{\stackoverflow}[2]{\def\@stackoverflowid{#1}\def\@stackoverflowname{#2}} + +% Defines writer's skype (optional) +% Usage: \skype{} +\newcommand*{\skype}[1]{\def\@skype{#1}} + +% Defines writer's twitter (optional) +% Usage: \twitter{} +\newcommand*{\twitter}[1]{\def\@twitter{#1}} + +% Defines writer's quote (optional) +% Usage: \quote{} +\renewcommand*{\quote}[1]{\def\@quote{#1}} + +% Defines recipient's information (cover letter only) +% Usage: \recipient{}{} +% Usage: \recipientname{} +% Usage: \recipientaddress{} +\newcommand*{\recipient}[2]{\def\@recipientname{#1}\def\@recipientaddress{#2}} +\newcommand*{\recipientname}[1]{\def\@recipientname{#1}} +\newcommand*{\recipientaddress}[1]{\def\@recipientaddress{#1}} + +% Defines the title for letter (cover letter only, optional) +% Usage: \lettertitle{} +\newcommand*{\lettertitle}[1]{\def\@lettertitle{#1}} + +% Defines the date for letter (cover letter only) +% Usage: \letterdate{<date>} +\newcommand*{\letterdate}[1]{\def\@letterdate{#1}} + +% Defines a message of opening for letter (cover letter only) +% Usage: \letteropening{<message>} +\newcommand*{\letteropening}[1]{\def\@letteropening{#1}} + +% Defines a message of closing for letter (cover letter only) +% Usage: \letterclosing{<message>} +\newcommand*{\letterclosing}[1]{\def\@letterclosing{#1}} + +% Defines an enclosure for letter (cover letter only, optional) +% Usage: \letterenclosure[<enclosure name>]{<enclosure>} +\newcommand*{\letterenclname}[1][Enclosure]{\def\@letterenclname{#1}} +\newcommand*{\letterenclosure}[2][]{ + % if an optional argument is provided, use it to redefine \enclname + \ifthenelse{\equal{#1}{}}{}{\def\@letterenclname{#1}} + \def\@letterenclosure{#2} +} + + +%------------------------------------------------------------------------------- +% Commands for extra +%------------------------------------------------------------------------------- +% Define separator for social informations in header +% Usage: \headersocialsep{<separator>} +% Default: \quad\textbar\quad +\newcommand*{\headersocialsep}[1][\quad\textbar\quad]{\def\@headersocialsep{#1}} +\headersocialsep + + +%------------------------------------------------------------------------------- +% Commands for utilities +%------------------------------------------------------------------------------- +% Use to align an element of tabular table +\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} +\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} +\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} + +% Use to draw horizontal line with specific tickness +\def\vhrulefill#1{\leavevmode\leaders\hrule\@height#1\hfill \kern\z@} + +% Use to execute conditional statements by checking empty string +\newcommand*{\ifempty}[3]{\ifthenelse{\isempty{#1}}{#2}{#3}} + + +%------------------------------------------------------------------------------- +% Commands for elements of CV structure +%------------------------------------------------------------------------------- +% Define a header for CV +% Usage: \makecvheader +\newcommand*{\makecvheader}{ + \begin{center} + \headerfirstnamestyle{ + \@firstname + } \headerlastnamestyle{ + \@lastname + } + \\ + \vspace{0.4mm} + \ifthenelse{\isundefined{\@position}}{}{\headerpositionstyle{\@position\\}} + \vspace{0.4mm} + \ifthenelse{\isundefined{\@address}}{}{\headeraddressstyle{\@address\\}} + \vspace{-0.5mm} + \headersocialstyle{ + \newbool{isstart} + \setbool{isstart}{true} + \ifthenelse{\isundefined{\@mobile}} + {} + { + \faMobile\ \@mobile + \setbool{isstart}{false} + } + \ifthenelse{\isundefined{\@email}} + {} + { + \ifbool{isstart} + { + \setbool{isstart}{false} + } + {\@headersocialsep} + \href{mailto:\@email}{\faEnvelope\ \@email} + } + \ifthenelse{\isundefined{\@link}} + {} + { + \ifbool{isstart} + { + \setbool{isstart}{false} + } + {\@headersocialsep} + \href{http://\@link}{\faLink\ \@link} + } + \ifthenelse{\isundefined{\@github}} + {} + { + \ifbool{isstart} + { + \setbool{isstart}{false} + } + {\@headersocialsep} + \href{https://github.com/\@github}{\faGithubSquare\ \@github} + } + \ifthenelse{\isundefined{\@stackoverflowid}} + {} + { + \ifbool{isstart} + { + \setbool{isstart}{false} + } + {\@headersocialsep} + \href{https://stackoverflow.com/users/\@stackoverflowid}{\faStackOverflow\ \@stackoverflowname} + } + \ifthenelse{\isundefined{\@linkedin}} + {} + { + \ifbool{isstart} + { + \setbool{isstart}{false} + } + {\@headersocialsep} + \href{https://www.linkedin.com/in/\@linkedin}{\faLinkedinSquare\ \@linkedin} + } + \ifthenelse{\isundefined{\@location}} + {} + { + \ifbool{isstart} + { + \setbool{isstart}{false} + } + {\@headersocialsep} + {}{\faMapMarker\ \@location} + } + \ifthenelse{\isundefined{\@twitter}} + {} + { + \ifbool{isstart} + { + \setbool{isstart}{false} + } + {\@headersocialsep} + \href{https://twitter.com/\@twitter}{\faTwitter\ \@twitter} + } + \ifthenelse{\isundefined{\@skype}} + {} + { + \ifbool{isstart} + { + \setbool{isstart}{false} + } + {\@headersocialsep} + \faSkype\ \@skype + } + } \\ + \ifthenelse{\isundefined{\@quote}} + {} + {\vspace{6.0mm}\headerquotestyle{\@quote\\}\vspace{5.0mm}} + \end{center} +} + +% Define a footer for CV +% Usage: \makecvfooter{<left>}{<center>}{<right>} +\newcommand*{\makecvfooter}[3]{ + \fancyfoot{} + \fancyfoot[L]{ + \footerstyle{#1} + } + \fancyfoot[C]{ + \footerstyle{#2} + } + \fancyfoot[R]{ + \footerstyle{#3} + } +} + +% Define a section for CV +% Usage: \cvsection{<section-title>} +\newcommand{\cvsection}[1]{ + \par\addvspace{1.5ex} + \phantomsection{} + \sectionstyle{#1} + \color{gray}\vhrulefill{0.9pt} + \par\nobreak\addvspace{1ex} +} + +% Define a subsection for CV +% Usage: \cvsubsection{<subsection-title>} +\newcommand{\cvsubsection}[1]{ + \phantomsection{} + \subsectionstyle{#1} +} + +% Define an environment for cventry +\newenvironment{cventries}{ + \begin{center} +}{ + \end{center} +} +% Define an entry of cv information +% Usage: \cventry{<position>}{<title>}{<location>}{<date>}{<description>} +\newcommand*{\cventry}[5]{ + \setlength\tabcolsep{0pt} + \setlength{\extrarowheight}{0pt} + \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{12.5cm} R{4.5cm}} + \ifempty{#2#3} + {\entrypositionstyle{#1} & \entrydatestyle{#4} \\} + {\entrytitlestyle{#2} & \entrylocationstyle{#3} \\ + \entrypositionstyle{#1} & \entrydatestyle{#4} \\} + \multicolumn{2}{L{17cm}}{\descriptionstyle{#5}} \\ + \end{tabular*} +} + +% Define an environment for cvsubentry +\newenvironment{cvsubentries}{ + \begin{center} +}{ + \end{center} +} +% Define a subentry of cv information +% Usage: \cvsubentry{<position>}{<title>}{<date>}{<description>} +\newcommand*{\cvsubentry}[4]{ + \setlength\tabcolsep{0pt} + \setlength{\extrarowheight}{0pt} + \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{12.5cm} R{4.5cm}} + \setlength\leftskip{0.2cm} + \subentrytitlestyle{#2} & \ifthenelse{\equal{#1}{}} + {\subentrydatestyle{#3}}{} + \ifthenelse{\equal{#1}{}} + {} + {\subentrypositionstyle{#1} & \subentrydatestyle{#3} \\} + \ifthenelse{\equal{#4}{}} + {} + {\multicolumn{2}{L{17.0cm}}{\subdescriptionstyle{#4}} \\} + \end{tabular*} +} + +% Define an environment for cvhonor +\newenvironment{cvhonors}{ + \begin{center} + \setlength\tabcolsep{0pt} + \setlength{\extrarowheight}{0pt} + \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} C{1.5cm} L{13.0cm} R{2.5cm}} +}{ + \end{tabular*} + \end{center} +} +% Define a line of cv information(honor, award or something else) +% Usage: \cvhonor{<position>}{<title>}{<location>}{<date>} +\newcommand*{\cvhonor}[4]{ + \honordatestyle{#4} & \honorpositionstyle{#1}, \honortitlestyle{#2} & \honorlocationstyle{#3} + \\ +} + +% Define an environment for cvskill +\newenvironment{cvskills}{ + \begin{center} + \setlength\tabcolsep{1ex} + \setlength{\extrarowheight}{0pt} + \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} r L{15.2cm}} +}{ + \end{tabular*} + \end{center} +} +% Define a line of cv information(skill) +% Usage: \cvskill{<type>}{<skillset>} +\newcommand*{\cvskill}[2]{ + \skilltypestyle{#1} & \skillsetstyle{#2} + \\ +} + +% Define an environment for cvitems(for cventry) +\newenvironment{cvitems}{ + \vspace{-4mm} + \begin{justify} + \begin{itemize}[leftmargin=2ex, nosep, noitemsep] + \setlength{\parskip}{0pt} + \renewcommand{\labelitemi}{\bullet} +}{ + \end{itemize} + \end{justify} + \vspace{-2mm} +} + + +%------------------------------------------------------------------------------- +% Commands for elements of Cover Letter +%------------------------------------------------------------------------------- +% Define an environment for cvletter +\newenvironment{cvletter}{ + \lettertextstyle +}{ +} + +% Define a paragraph for cvletter +% Usage: \cvparagraph{<paragraph-title>} +\newcommand{\cvparagraph}[1]{ + \par\addvspace{2.5ex} + \phantomsection{} + \paragraphstyle{#1} + \color{gray}\vhrulefill{0.9pt} + \par\nobreak\addvspace{0.4ex} +} + +% Define a title of the cover letter +% Usage: \makelettertitle +\newcommand*{\makelettertitle}{ + \vspace{8.4mm} + \setlength\tabcolsep{0pt} + \setlength{\extrarowheight}{0pt} + \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{12.5cm} R{4.5cm}} + \recipienttitlestyle{\@recipientname} & \letterdatestyle{\@letterdate} + \end{tabular*} + \begin{singlespace} + \recipientaddressstyle{\@recipientaddress} \\\\ + \end{singlespace} + \ifthenelse{\isundefined{\@lettertitle}} + {} + {\lettertitlestyle{\@lettertitle} \\} + \lettertextstyle{\@letteropening} +} + +% Define a closing of the cover letter +% Usage: \makeletterclosing +\newcommand*{\makeletterclosing}{ + \vspace{3.4mm} + \lettertextstyle{\@letterclosing} \\\\ + \letternamestyle{\@firstname \@lastname} + \ifthenelse{\isundefined{\@letterenclosure}} + {\\} + { + \\\\\\ + \letterenclosurestyle{\@letterenclname: \@letterenclosure} \\ + } +} diff --git a/public/lib/templates/template2/inputs/fontawesome.sty b/public/lib/templates/template2/inputs/fontawesome.sty new file mode 100644 index 00000000..ca60f2b5 --- /dev/null +++ b/public/lib/templates/template2/inputs/fontawesome.sty @@ -0,0 +1,683 @@ +%% Copyright 2015 Claud D. Park <posquit0.bj@gmail.com> +%% It is based on furl's latex-fontawesome project. + +% Identify this package. +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{fontawesome}[2015/11/04 v4.4.0 font awesome icons] + +% Requirements to use. +\usepackage{fontspec} + +% Define shortcut to load the Font Awesome font. +\newfontfamily{\FA}[ +Path=fonts/ +]{FontAwesome} +% Generic command displaying an icon by its name. +\newcommand*{\faicon}[1]{{ + \FA\csname faicon@#1\endcsname +}} + +\expandafter\def\csname faicon@adjust\endcsname {\symbol{"F042}} \def\faAdjust {{\FA\csname faicon@adjust\endcsname}} +\expandafter\def\csname faicon@adn\endcsname {\symbol{"F170}} \def\faAdn {{\FA\csname faicon@adn\endcsname}} +\expandafter\def\csname faicon@align-center\endcsname {\symbol{"F037}} \def\faAlignCenter {{\FA\csname faicon@align-center\endcsname}} +\expandafter\def\csname faicon@align-justify\endcsname {\symbol{"F039}} \def\faAlignJustify {{\FA\csname faicon@align-justify\endcsname}} +\expandafter\def\csname faicon@align-left\endcsname {\symbol{"F036}} \def\faAlignLeft {{\FA\csname faicon@align-left\endcsname}} +\expandafter\def\csname faicon@align-right\endcsname {\symbol{"F038}} \def\faAlignRight {{\FA\csname faicon@align-right\endcsname}} +\expandafter\def\csname faicon@amazon\endcsname {\symbol{"F270}} \def\faAmazon {{\FA\csname faicon@amazon\endcsname}} +\expandafter\def\csname faicon@ambulance\endcsname {\symbol{"F0F9}} \def\faAmbulance {{\FA\csname faicon@ambulance\endcsname}} +\expandafter\def\csname faicon@anchor\endcsname {\symbol{"F13D}} \def\faAnchor {{\FA\csname faicon@anchor\endcsname}} +\expandafter\def\csname faicon@android\endcsname {\symbol{"F17B}} \def\faAndroid {{\FA\csname faicon@android\endcsname}} +\expandafter\def\csname faicon@angellist\endcsname {\symbol{"F209}} \def\faAngellist {{\FA\csname faicon@angellist\endcsname}} +\expandafter\def\csname faicon@angle-double-down\endcsname {\symbol{"F103}} \def\faAngleDoubleDown {{\FA\csname faicon@angle-double-down\endcsname}} +\expandafter\def\csname faicon@angle-double-left\endcsname {\symbol{"F100}} \def\faAngleDoubleLeft {{\FA\csname faicon@angle-double-left\endcsname}} +\expandafter\def\csname faicon@angle-double-right\endcsname {\symbol{"F101}} \def\faAngleDoubleRight {{\FA\csname faicon@angle-double-right\endcsname}} +\expandafter\def\csname faicon@angle-double-up\endcsname {\symbol{"F102}} \def\faAngleDoubleUp {{\FA\csname faicon@angle-double-up\endcsname}} +\expandafter\def\csname faicon@angle-down\endcsname {\symbol{"F107}} \def\faAngleDown {{\FA\csname faicon@angle-down\endcsname}} +\expandafter\def\csname faicon@angle-left\endcsname {\symbol{"F104}} \def\faAngleLeft {{\FA\csname faicon@angle-left\endcsname}} +\expandafter\def\csname faicon@angle-right\endcsname {\symbol{"F105}} \def\faAngleRight {{\FA\csname faicon@angle-right\endcsname}} +\expandafter\def\csname faicon@angle-up\endcsname {\symbol{"F106}} \def\faAngleUp {{\FA\csname faicon@angle-up\endcsname}} +\expandafter\def\csname faicon@apple\endcsname {\symbol{"F179}} \def\faApple {{\FA\csname faicon@apple\endcsname}} +\expandafter\def\csname faicon@archive\endcsname {\symbol{"F187}} \def\faArchive {{\FA\csname faicon@archive\endcsname}} +\expandafter\def\csname faicon@area-chart\endcsname {\symbol{"F1FE}} \def\faAreaChart {{\FA\csname faicon@area-chart\endcsname}} +\expandafter\def\csname faicon@arrow-circle-down\endcsname {\symbol{"F0AB}} \def\faArrowCircleDown {{\FA\csname faicon@arrow-circle-down\endcsname}} +\expandafter\def\csname faicon@arrow-circle-left\endcsname {\symbol{"F0A8}} \def\faArrowCircleLeft {{\FA\csname faicon@arrow-circle-left\endcsname}} +\expandafter\def\csname faicon@arrow-circle-o-down\endcsname {\symbol{"F01A}} \def\faArrowCircleODown {{\FA\csname faicon@arrow-circle-o-down\endcsname}} +\expandafter\def\csname faicon@arrow-circle-o-left\endcsname {\symbol{"F190}} \def\faArrowCircleOLeft {{\FA\csname faicon@arrow-circle-o-left\endcsname}} +\expandafter\def\csname faicon@arrow-circle-o-right\endcsname {\symbol{"F18E}} \def\faArrowCircleORight {{\FA\csname faicon@arrow-circle-o-right\endcsname}} +\expandafter\def\csname faicon@arrow-circle-o-up\endcsname {\symbol{"F01B}} \def\faArrowCircleOUp {{\FA\csname faicon@arrow-circle-o-up\endcsname}} +\expandafter\def\csname faicon@arrow-circle-right\endcsname {\symbol{"F0A9}} \def\faArrowCircleRight {{\FA\csname faicon@arrow-circle-right\endcsname}} +\expandafter\def\csname faicon@arrow-circle-up\endcsname {\symbol{"F0AA}} \def\faArrowCircleUp {{\FA\csname faicon@arrow-circle-up\endcsname}} +\expandafter\def\csname faicon@arrow-down\endcsname {\symbol{"F063}} \def\faArrowDown {{\FA\csname faicon@arrow-down\endcsname}} +\expandafter\def\csname faicon@arrow-left\endcsname {\symbol{"F060}} \def\faArrowLeft {{\FA\csname faicon@arrow-left\endcsname}} +\expandafter\def\csname faicon@arrow-right\endcsname {\symbol{"F061}} \def\faArrowRight {{\FA\csname faicon@arrow-right\endcsname}} +\expandafter\def\csname faicon@arrow-up\endcsname {\symbol{"F062}} \def\faArrowUp {{\FA\csname faicon@arrow-up\endcsname}} +\expandafter\def\csname faicon@arrows\endcsname {\symbol{"F047}} \def\faArrows {{\FA\csname faicon@arrows\endcsname}} +\expandafter\def\csname faicon@arrows-alt\endcsname {\symbol{"F0B2}} \def\faArrowsAlt {{\FA\csname faicon@arrows-alt\endcsname}} +\expandafter\def\csname faicon@arrows-h\endcsname {\symbol{"F07E}} \def\faArrowsH {{\FA\csname faicon@arrows-h\endcsname}} +\expandafter\def\csname faicon@arrows-v\endcsname {\symbol{"F07D}} \def\faArrowsV {{\FA\csname faicon@arrows-v\endcsname}} +\expandafter\def\csname faicon@asterisk\endcsname {\symbol{"F069}} \def\faAsterisk {{\FA\csname faicon@asterisk\endcsname}} +\expandafter\def\csname faicon@at\endcsname {\symbol{"F1FA}} \def\faAt {{\FA\csname faicon@at\endcsname}} +\expandafter\def\csname faicon@automobile\endcsname {\symbol{"F1B9}} \def\faAutomobile {{\FA\csname faicon@automobile\endcsname}} +\expandafter\def\csname faicon@backward\endcsname {\symbol{"F04A}} \def\faBackward {{\FA\csname faicon@backward\endcsname}} +\expandafter\def\csname faicon@balance-scale\endcsname {\symbol{"F24E}} \def\faBalanceScale {{\FA\csname faicon@balance-scale\endcsname}} +\expandafter\def\csname faicon@ban\endcsname {\symbol{"F05E}} \def\faBan {{\FA\csname faicon@ban\endcsname}} +\expandafter\def\csname faicon@bank\endcsname {\symbol{"F19C}} \def\faBank {{\FA\csname faicon@bank\endcsname}} +\expandafter\def\csname faicon@bar-chart\endcsname {\symbol{"F080}} \def\faBarChart {{\FA\csname faicon@bar-chart\endcsname}} +\expandafter\def\csname faicon@bar-chart-o\endcsname {\symbol{"F080}} \def\faBarChartO {{\FA\csname faicon@bar-chart-o\endcsname}} +\expandafter\def\csname faicon@barcode\endcsname {\symbol{"F02A}} \def\faBarcode {{\FA\csname faicon@barcode\endcsname}} +\expandafter\def\csname faicon@bars\endcsname {\symbol{"F0C9}} \def\faBars {{\FA\csname faicon@bars\endcsname}} +\expandafter\def\csname faicon@battery-empty\endcsname {\symbol{"F244}} \def\faBatteryEmpty {{\FA\csname faicon@battery-empty\endcsname}} +\expandafter\def\csname faicon@battery-full\endcsname {\symbol{"F240}} \def\faBatteryFull {{\FA\csname faicon@battery-full\endcsname}} +\expandafter\def\csname faicon@battery-half\endcsname {\symbol{"F242}} \def\faBatteryHalf {{\FA\csname faicon@battery-half\endcsname}} +\expandafter\def\csname faicon@battery-quarter\endcsname {\symbol{"F243}} \def\faBatteryQuarter {{\FA\csname faicon@battery-quarter\endcsname}} +\expandafter\def\csname faicon@battery-three-quarters\endcsname {\symbol{"F241}} \def\faBatteryThreeQuarters {{\FA\csname faicon@battery-three-quarters\endcsname}} +\expandafter\def\csname faicon@bed\endcsname {\symbol{"F236}} \def\faBed {{\FA\csname faicon@bed\endcsname}} +\expandafter\def\csname faicon@beer\endcsname {\symbol{"F0FC}} \def\faBeer {{\FA\csname faicon@beer\endcsname}} +\expandafter\def\csname faicon@behance\endcsname {\symbol{"F1B4}} \def\faBehance {{\FA\csname faicon@behance\endcsname}} +\expandafter\def\csname faicon@behance-square\endcsname {\symbol{"F1B5}} \def\faBehanceSquare {{\FA\csname faicon@behance-square\endcsname}} +\expandafter\def\csname faicon@bell\endcsname {\symbol{"F0F3}} \def\faBell {{\FA\csname faicon@bell\endcsname}} +\expandafter\def\csname faicon@bell-o\endcsname {\symbol{"F0A2}} \def\faBellO {{\FA\csname faicon@bell-o\endcsname}} +\expandafter\def\csname faicon@bell-slash\endcsname {\symbol{"F1F6}} \def\faBellSlash {{\FA\csname faicon@bell-slash\endcsname}} +\expandafter\def\csname faicon@bell-slash-o\endcsname {\symbol{"F1F7}} \def\faBellSlashO {{\FA\csname faicon@bell-slash-o\endcsname}} +\expandafter\def\csname faicon@bicycle\endcsname {\symbol{"F206}} \def\faBicycle {{\FA\csname faicon@bicycle\endcsname}} +\expandafter\def\csname faicon@binoculars\endcsname {\symbol{"F1E5}} \def\faBinoculars {{\FA\csname faicon@binoculars\endcsname}} +\expandafter\def\csname faicon@birthday-cake\endcsname {\symbol{"F1FD}} \def\faBirthdayCake {{\FA\csname faicon@birthday-cake\endcsname}} +\expandafter\def\csname faicon@bitbucket\endcsname {\symbol{"F171}} \def\faBitbucket {{\FA\csname faicon@bitbucket\endcsname}} +\expandafter\def\csname faicon@bitbucket-square\endcsname {\symbol{"F172}} \def\faBitbucketSquare {{\FA\csname faicon@bitbucket-square\endcsname}} +\expandafter\def\csname faicon@bitcoin\endcsname {\symbol{"F15A}} \def\faBitcoin {{\FA\csname faicon@bitcoin\endcsname}} +\expandafter\def\csname faicon@black-tie\endcsname {\symbol{"F27E}} \def\faBlackTie {{\FA\csname faicon@black-tie\endcsname}} +\expandafter\def\csname faicon@bold\endcsname {\symbol{"F032}} \def\faBold {{\FA\csname faicon@bold\endcsname}} +\expandafter\def\csname faicon@bolt\endcsname {\symbol{"F0E7}} \def\faBolt {{\FA\csname faicon@bolt\endcsname}} +\expandafter\def\csname faicon@bomb\endcsname {\symbol{"F1E2}} \def\faBomb {{\FA\csname faicon@bomb\endcsname}} +\expandafter\def\csname faicon@book\endcsname {\symbol{"F02D}} \def\faBook {{\FA\csname faicon@book\endcsname}} +\expandafter\def\csname faicon@bookmark\endcsname {\symbol{"F02E}} \def\faBookmark {{\FA\csname faicon@bookmark\endcsname}} +\expandafter\def\csname faicon@bookmark-o\endcsname {\symbol{"F097}} \def\faBookmarkO {{\FA\csname faicon@bookmark-o\endcsname}} +\expandafter\def\csname faicon@briefcase\endcsname {\symbol{"F0B1}} \def\faBriefcase {{\FA\csname faicon@briefcase\endcsname}} +\expandafter\def\csname faicon@btc\endcsname {\symbol{"F15A}} \def\faBtc {{\FA\csname faicon@btc\endcsname}} +\expandafter\def\csname faicon@bug\endcsname {\symbol{"F188}} \def\faBug {{\FA\csname faicon@bug\endcsname}} +\expandafter\def\csname faicon@building\endcsname {\symbol{"F1AD}} \def\faBuilding {{\FA\csname faicon@building\endcsname}} +\expandafter\def\csname faicon@building-o\endcsname {\symbol{"F0F7}} \def\faBuildingO {{\FA\csname faicon@building-o\endcsname}} +\expandafter\def\csname faicon@bullhorn\endcsname {\symbol{"F0A1}} \def\faBullhorn {{\FA\csname faicon@bullhorn\endcsname}} +\expandafter\def\csname faicon@bullseye\endcsname {\symbol{"F140}} \def\faBullseye {{\FA\csname faicon@bullseye\endcsname}} +\expandafter\def\csname faicon@bus\endcsname {\symbol{"F207}} \def\faBus {{\FA\csname faicon@bus\endcsname}} +\expandafter\def\csname faicon@buysellads\endcsname {\symbol{"F20D}} \def\faBuysellads {{\FA\csname faicon@buysellads\endcsname}} +\expandafter\def\csname faicon@cab\endcsname {\symbol{"F1BA}} \def\faCab {{\FA\csname faicon@cab\endcsname}} +\expandafter\def\csname faicon@calculator\endcsname {\symbol{"F1EC}} \def\faCalculator {{\FA\csname faicon@calculator\endcsname}} +\expandafter\def\csname faicon@calendar\endcsname {\symbol{"F073}} \def\faCalendar {{\FA\csname faicon@calendar\endcsname}} +\expandafter\def\csname faicon@calendar-check-o\endcsname {\symbol{"F274}} \def\faCalendarCheckO {{\FA\csname faicon@calendar-check-o\endcsname}} +\expandafter\def\csname faicon@calendar-minus-o\endcsname {\symbol{"F272}} \def\faCalendarMinusO {{\FA\csname faicon@calendar-minus-o\endcsname}} +\expandafter\def\csname faicon@calendar-o\endcsname {\symbol{"F133}} \def\faCalendarO {{\FA\csname faicon@calendar-o\endcsname}} +\expandafter\def\csname faicon@calendar-plus-o\endcsname {\symbol{"F271}} \def\faCalendarPlusO {{\FA\csname faicon@calendar-plus-o\endcsname}} +\expandafter\def\csname faicon@calendar-times-o\endcsname {\symbol{"F273}} \def\faCalendarTimesO {{\FA\csname faicon@calendar-times-o\endcsname}} +\expandafter\def\csname faicon@camera\endcsname {\symbol{"F030}} \def\faCamera {{\FA\csname faicon@camera\endcsname}} +\expandafter\def\csname faicon@camera-retro\endcsname {\symbol{"F083}} \def\faCameraRetro {{\FA\csname faicon@camera-retro\endcsname}} +\expandafter\def\csname faicon@car\endcsname {\symbol{"F1B9}} \def\faCar {{\FA\csname faicon@car\endcsname}} +\expandafter\def\csname faicon@caret-down\endcsname {\symbol{"F0D7}} \def\faCaretDown {{\FA\csname faicon@caret-down\endcsname}} +\expandafter\def\csname faicon@caret-left\endcsname {\symbol{"F0D9}} \def\faCaretLeft {{\FA\csname faicon@caret-left\endcsname}} +\expandafter\def\csname faicon@caret-right\endcsname {\symbol{"F0DA}} \def\faCaretRight {{\FA\csname faicon@caret-right\endcsname}} +\expandafter\def\csname faicon@caret-square-o-down\endcsname {\symbol{"F150}} \def\faCaretSquareODown {{\FA\csname faicon@caret-square-o-down\endcsname}} +\expandafter\def\csname faicon@caret-square-o-left\endcsname {\symbol{"F191}} \def\faCaretSquareOLeft {{\FA\csname faicon@caret-square-o-left\endcsname}} +\expandafter\def\csname faicon@caret-square-o-right\endcsname {\symbol{"F152}} \def\faCaretSquareORight {{\FA\csname faicon@caret-square-o-right\endcsname}} +\expandafter\def\csname faicon@caret-square-o-up\endcsname {\symbol{"F151}} \def\faCaretSquareOUp {{\FA\csname faicon@caret-square-o-up\endcsname}} +\expandafter\def\csname faicon@caret-up\endcsname {\symbol{"F0D8}} \def\faCaretUp {{\FA\csname faicon@caret-up\endcsname}} +\expandafter\def\csname faicon@cart-arrow-down\endcsname {\symbol{"F218}} \def\faCartArrowDown {{\FA\csname faicon@cart-arrow-down\endcsname}} +\expandafter\def\csname faicon@cart-plus\endcsname {\symbol{"F217}} \def\faCartPlus {{\FA\csname faicon@cart-plus\endcsname}} +\expandafter\def\csname faicon@cc\endcsname {\symbol{"F20A}} \def\faCc {{\FA\csname faicon@cc\endcsname}} +\expandafter\def\csname faicon@cc-amex\endcsname {\symbol{"F1F3}} \def\faCcAmex {{\FA\csname faicon@cc-amex\endcsname}} +\expandafter\def\csname faicon@cc-diners-club\endcsname {\symbol{"F24C}} \def\faCcDinersClub {{\FA\csname faicon@cc-diners-club\endcsname}} +\expandafter\def\csname faicon@cc-discover\endcsname {\symbol{"F1F2}} \def\faCcDiscover {{\FA\csname faicon@cc-discover\endcsname}} +\expandafter\def\csname faicon@cc-jcb\endcsname {\symbol{"F24B}} \def\faCcJcb {{\FA\csname faicon@cc-jcb\endcsname}} +\expandafter\def\csname faicon@cc-mastercard\endcsname {\symbol{"F1F1}} \def\faCcMastercard {{\FA\csname faicon@cc-mastercard\endcsname}} +\expandafter\def\csname faicon@cc-paypal\endcsname {\symbol{"F1F4}} \def\faCcPaypal {{\FA\csname faicon@cc-paypal\endcsname}} +\expandafter\def\csname faicon@cc-stripe\endcsname {\symbol{"F1F5}} \def\faCcStripe {{\FA\csname faicon@cc-stripe\endcsname}} +\expandafter\def\csname faicon@cc-visa\endcsname {\symbol{"F1F0}} \def\faCcVisa {{\FA\csname faicon@cc-visa\endcsname}} +\expandafter\def\csname faicon@certificate\endcsname {\symbol{"F0A3}} \def\faCertificate {{\FA\csname faicon@certificate\endcsname}} +\expandafter\def\csname faicon@chain\endcsname {\symbol{"F0C1}} \def\faChain {{\FA\csname faicon@chain\endcsname}} +\expandafter\def\csname faicon@chain-broken\endcsname {\symbol{"F127}} \def\faChainBroken {{\FA\csname faicon@chain-broken\endcsname}} +\expandafter\def\csname faicon@check\endcsname {\symbol{"F00C}} \def\faCheck {{\FA\csname faicon@check\endcsname}} +\expandafter\def\csname faicon@check-circle\endcsname {\symbol{"F058}} \def\faCheckCircle {{\FA\csname faicon@check-circle\endcsname}} +\expandafter\def\csname faicon@check-circle-o\endcsname {\symbol{"F05D}} \def\faCheckCircleO {{\FA\csname faicon@check-circle-o\endcsname}} +\expandafter\def\csname faicon@check-square\endcsname {\symbol{"F14A}} \def\faCheckSquare {{\FA\csname faicon@check-square\endcsname}} +\expandafter\def\csname faicon@check-square-o\endcsname {\symbol{"F046}} \def\faCheckSquareO {{\FA\csname faicon@check-square-o\endcsname}} +\expandafter\def\csname faicon@chevron-circle-down\endcsname {\symbol{"F13A}} \def\faChevronCircleDown {{\FA\csname faicon@chevron-circle-down\endcsname}} +\expandafter\def\csname faicon@chevron-circle-left\endcsname {\symbol{"F137}} \def\faChevronCircleLeft {{\FA\csname faicon@chevron-circle-left\endcsname}} +\expandafter\def\csname faicon@chevron-circle-right\endcsname {\symbol{"F138}} \def\faChevronCircleRight {{\FA\csname faicon@chevron-circle-right\endcsname}} +\expandafter\def\csname faicon@chevron-circle-up\endcsname {\symbol{"F139}} \def\faChevronCircleUp {{\FA\csname faicon@chevron-circle-up\endcsname}} +\expandafter\def\csname faicon@chevron-down\endcsname {\symbol{"F078}} \def\faChevronDown {{\FA\csname faicon@chevron-down\endcsname}} +\expandafter\def\csname faicon@chevron-left\endcsname {\symbol{"F053}} \def\faChevronLeft {{\FA\csname faicon@chevron-left\endcsname}} +\expandafter\def\csname faicon@chevron-right\endcsname {\symbol{"F054}} \def\faChevronRight {{\FA\csname faicon@chevron-right\endcsname}} +\expandafter\def\csname faicon@chevron-up\endcsname {\symbol{"F077}} \def\faChevronUp {{\FA\csname faicon@chevron-up\endcsname}} +\expandafter\def\csname faicon@child\endcsname {\symbol{"F1AE}} \def\faChild {{\FA\csname faicon@child\endcsname}} +\expandafter\def\csname faicon@chrome\endcsname {\symbol{"F268}} \def\faChrome {{\FA\csname faicon@chrome\endcsname}} +\expandafter\def\csname faicon@circle\endcsname {\symbol{"F111}} \def\faCircle {{\FA\csname faicon@circle\endcsname}} +\expandafter\def\csname faicon@circle-o\endcsname {\symbol{"F10C}} \def\faCircleO {{\FA\csname faicon@circle-o\endcsname}} +\expandafter\def\csname faicon@circle-o-notch\endcsname {\symbol{"F1CE}} \def\faCircleONotch {{\FA\csname faicon@circle-o-notch\endcsname}} +\expandafter\def\csname faicon@circle-thin\endcsname {\symbol{"F1DB}} \def\faCircleThin {{\FA\csname faicon@circle-thin\endcsname}} +\expandafter\def\csname faicon@clipboard\endcsname {\symbol{"F0EA}} \def\faClipboard {{\FA\csname faicon@clipboard\endcsname}} +\expandafter\def\csname faicon@clock-o\endcsname {\symbol{"F017}} \def\faClockO {{\FA\csname faicon@clock-o\endcsname}} +\expandafter\def\csname faicon@clone\endcsname {\symbol{"F24D}} \def\faClone {{\FA\csname faicon@clone\endcsname}} +\expandafter\def\csname faicon@close\endcsname {\symbol{"F00D}} \def\faClose {{\FA\csname faicon@close\endcsname}} +\expandafter\def\csname faicon@cloud\endcsname {\symbol{"F0C2}} \def\faCloud {{\FA\csname faicon@cloud\endcsname}} +\expandafter\def\csname faicon@cloud-download\endcsname {\symbol{"F0ED}} \def\faCloudDownload {{\FA\csname faicon@cloud-download\endcsname}} +\expandafter\def\csname faicon@cloud-upload\endcsname {\symbol{"F0EE}} \def\faCloudUpload {{\FA\csname faicon@cloud-upload\endcsname}} +\expandafter\def\csname faicon@cny\endcsname {\symbol{"F157}} \def\faCny {{\FA\csname faicon@cny\endcsname}} +\expandafter\def\csname faicon@code\endcsname {\symbol{"F121}} \def\faCode {{\FA\csname faicon@code\endcsname}} +\expandafter\def\csname faicon@code-fork\endcsname {\symbol{"F126}} \def\faCodeFork {{\FA\csname faicon@code-fork\endcsname}} +\expandafter\def\csname faicon@codepen\endcsname {\symbol{"F1CB}} \def\faCodepen {{\FA\csname faicon@codepen\endcsname}} +\expandafter\def\csname faicon@coffee\endcsname {\symbol{"F0F4}} \def\faCoffee {{\FA\csname faicon@coffee\endcsname}} +\expandafter\def\csname faicon@cog\endcsname {\symbol{"F013}} \def\faCog {{\FA\csname faicon@cog\endcsname}} +\expandafter\def\csname faicon@cogs\endcsname {\symbol{"F085}} \def\faCogs {{\FA\csname faicon@cogs\endcsname}} +\expandafter\def\csname faicon@columns\endcsname {\symbol{"F0DB}} \def\faColumns {{\FA\csname faicon@columns\endcsname}} +\expandafter\def\csname faicon@comment\endcsname {\symbol{"F075}} \def\faComment {{\FA\csname faicon@comment\endcsname}} +\expandafter\def\csname faicon@comment-o\endcsname {\symbol{"F0E5}} \def\faCommentO {{\FA\csname faicon@comment-o\endcsname}} +\expandafter\def\csname faicon@commenting\endcsname {\symbol{"F27A}} \def\faCommenting {{\FA\csname faicon@commenting\endcsname}} +\expandafter\def\csname faicon@commenting-o\endcsname {\symbol{"F27B}} \def\faCommentingO {{\FA\csname faicon@commenting-o\endcsname}} +\expandafter\def\csname faicon@comments\endcsname {\symbol{"F086}} \def\faComments {{\FA\csname faicon@comments\endcsname}} +\expandafter\def\csname faicon@comments-o\endcsname {\symbol{"F0E6}} \def\faCommentsO {{\FA\csname faicon@comments-o\endcsname}} +\expandafter\def\csname faicon@compass\endcsname {\symbol{"F14E}} \def\faCompass {{\FA\csname faicon@compass\endcsname}} +\expandafter\def\csname faicon@compress\endcsname {\symbol{"F066}} \def\faCompress {{\FA\csname faicon@compress\endcsname}} +\expandafter\def\csname faicon@connectdevelop\endcsname {\symbol{"F20E}} \def\faConnectdevelop {{\FA\csname faicon@connectdevelop\endcsname}} +\expandafter\def\csname faicon@contao\endcsname {\symbol{"F26D}} \def\faContao {{\FA\csname faicon@contao\endcsname}} +\expandafter\def\csname faicon@copy\endcsname {\symbol{"F0C5}} \def\faCopy {{\FA\csname faicon@copy\endcsname}} +\expandafter\def\csname faicon@copyright\endcsname {\symbol{"F1F9}} \def\faCopyright {{\FA\csname faicon@copyright\endcsname}} +\expandafter\def\csname faicon@creative-commons\endcsname {\symbol{"F25E}} \def\faCreativeCommons {{\FA\csname faicon@creative-commons\endcsname}} +\expandafter\def\csname faicon@credit-card\endcsname {\symbol{"F09D}} \def\faCreditCard {{\FA\csname faicon@credit-card\endcsname}} +\expandafter\def\csname faicon@crop\endcsname {\symbol{"F125}} \def\faCrop {{\FA\csname faicon@crop\endcsname}} +\expandafter\def\csname faicon@crosshairs\endcsname {\symbol{"F05B}} \def\faCrosshairs {{\FA\csname faicon@crosshairs\endcsname}} +\expandafter\def\csname faicon@cube\endcsname {\symbol{"F1B2}} \def\faCube {{\FA\csname faicon@cube\endcsname}} +\expandafter\def\csname faicon@cubes\endcsname {\symbol{"F1B3}} \def\faCubes {{\FA\csname faicon@cubes\endcsname}} +\expandafter\def\csname faicon@cut\endcsname {\symbol{"F0C4}} \def\faCut {{\FA\csname faicon@cut\endcsname}} +\expandafter\def\csname faicon@cutlery\endcsname {\symbol{"F0F5}} \def\faCutlery {{\FA\csname faicon@cutlery\endcsname}} +\expandafter\def\csname faicon@dashboard\endcsname {\symbol{"F0E4}} \def\faDashboard {{\FA\csname faicon@dashboard\endcsname}} +\expandafter\def\csname faicon@dashcube\endcsname {\symbol{"F210}} \def\faDashcube {{\FA\csname faicon@dashcube\endcsname}} +\expandafter\def\csname faicon@database\endcsname {\symbol{"F1C0}} \def\faDatabase {{\FA\csname faicon@database\endcsname}} +\expandafter\def\csname faicon@dedent\endcsname {\symbol{"F03B}} \def\faDedent {{\FA\csname faicon@dedent\endcsname}} +\expandafter\def\csname faicon@delicious\endcsname {\symbol{"F1A5}} \def\faDelicious {{\FA\csname faicon@delicious\endcsname}} +\expandafter\def\csname faicon@desktop\endcsname {\symbol{"F108}} \def\faDesktop {{\FA\csname faicon@desktop\endcsname}} +\expandafter\def\csname faicon@deviantart\endcsname {\symbol{"F1BD}} \def\faDeviantart {{\FA\csname faicon@deviantart\endcsname}} +\expandafter\def\csname faicon@diamond\endcsname {\symbol{"F219}} \def\faDiamond {{\FA\csname faicon@diamond\endcsname}} +\expandafter\def\csname faicon@digg\endcsname {\symbol{"F1A6}} \def\faDigg {{\FA\csname faicon@digg\endcsname}} +\expandafter\def\csname faicon@dollar\endcsname {\symbol{"F155}} \def\faDollar {{\FA\csname faicon@dollar\endcsname}} +\expandafter\def\csname faicon@dot-circle-o\endcsname {\symbol{"F192}} \def\faDotCircleO {{\FA\csname faicon@dot-circle-o\endcsname}} +\expandafter\def\csname faicon@download\endcsname {\symbol{"F019}} \def\faDownload {{\FA\csname faicon@download\endcsname}} +\expandafter\def\csname faicon@dribbble\endcsname {\symbol{"F17D}} \def\faDribbble {{\FA\csname faicon@dribbble\endcsname}} +\expandafter\def\csname faicon@dropbox\endcsname {\symbol{"F16B}} \def\faDropbox {{\FA\csname faicon@dropbox\endcsname}} +\expandafter\def\csname faicon@drupal\endcsname {\symbol{"F1A9}} \def\faDrupal {{\FA\csname faicon@drupal\endcsname}} +\expandafter\def\csname faicon@edit\endcsname {\symbol{"F044}} \def\faEdit {{\FA\csname faicon@edit\endcsname}} +\expandafter\def\csname faicon@eject\endcsname {\symbol{"F052}} \def\faEject {{\FA\csname faicon@eject\endcsname}} +\expandafter\def\csname faicon@ellipsis-h\endcsname {\symbol{"F141}} \def\faEllipsisH {{\FA\csname faicon@ellipsis-h\endcsname}} +\expandafter\def\csname faicon@ellipsis-v\endcsname {\symbol{"F142}} \def\faEllipsisV {{\FA\csname faicon@ellipsis-v\endcsname}} +\expandafter\def\csname faicon@empire\endcsname {\symbol{"F1D1}} \def\faEmpire {{\FA\csname faicon@empire\endcsname}} +\expandafter\def\csname faicon@envelope\endcsname {\symbol{"F0E0}} \def\faEnvelope {{\FA\csname faicon@envelope\endcsname}} +\expandafter\def\csname faicon@envelope-o\endcsname {\symbol{"F003}} \def\faEnvelopeO {{\FA\csname faicon@envelope-o\endcsname}} +\expandafter\def\csname faicon@envelope-square\endcsname {\symbol{"F199}} \def\faEnvelopeSquare {{\FA\csname faicon@envelope-square\endcsname}} +\expandafter\def\csname faicon@eraser\endcsname {\symbol{"F12D}} \def\faEraser {{\FA\csname faicon@eraser\endcsname}} +\expandafter\def\csname faicon@eur\endcsname {\symbol{"F153}} \def\faEur {{\FA\csname faicon@eur\endcsname}} +\expandafter\def\csname faicon@euro\endcsname {\symbol{"F153}} \def\faEuro {{\FA\csname faicon@euro\endcsname}} +\expandafter\def\csname faicon@exchange\endcsname {\symbol{"F0EC}} \def\faExchange {{\FA\csname faicon@exchange\endcsname}} +\expandafter\def\csname faicon@exclamation\endcsname {\symbol{"F12A}} \def\faExclamation {{\FA\csname faicon@exclamation\endcsname}} +\expandafter\def\csname faicon@exclamation-circle\endcsname {\symbol{"F06A}} \def\faExclamationCircle {{\FA\csname faicon@exclamation-circle\endcsname}} +\expandafter\def\csname faicon@exclamation-triangle\endcsname {\symbol{"F071}} \def\faExclamationTriangle {{\FA\csname faicon@exclamation-triangle\endcsname}} +\expandafter\def\csname faicon@expand\endcsname {\symbol{"F065}} \def\faExpand {{\FA\csname faicon@expand\endcsname}} +\expandafter\def\csname faicon@expeditedssl\endcsname {\symbol{"F23E}} \def\faExpeditedssl {{\FA\csname faicon@expeditedssl\endcsname}} +\expandafter\def\csname faicon@external-link\endcsname {\symbol{"F08E}} \def\faExternalLink {{\FA\csname faicon@external-link\endcsname}} +\expandafter\def\csname faicon@external-link-square\endcsname {\symbol{"F14C}} \def\faExternalLinkSquare {{\FA\csname faicon@external-link-square\endcsname}} +\expandafter\def\csname faicon@eye\endcsname {\symbol{"F06E}} \def\faEye {{\FA\csname faicon@eye\endcsname}} +\expandafter\def\csname faicon@eye-slash\endcsname {\symbol{"F070}} \def\faEyeSlash {{\FA\csname faicon@eye-slash\endcsname}} +\expandafter\def\csname faicon@eyedropper\endcsname {\symbol{"F1FB}} \def\faEyedropper {{\FA\csname faicon@eyedropper\endcsname}} +\expandafter\def\csname faicon@facebook\endcsname {\symbol{"F09A}} \def\faFacebook {{\FA\csname faicon@facebook\endcsname}} +\expandafter\def\csname faicon@facebook-f\endcsname {\symbol{"F09A}} \def\faFacebookF {{\FA\csname faicon@facebook-f\endcsname}} +\expandafter\def\csname faicon@facebook-official\endcsname {\symbol{"F230}} \def\faFacebookOfficial {{\FA\csname faicon@facebook-official\endcsname}} +\expandafter\def\csname faicon@facebook-square\endcsname {\symbol{"F082}} \def\faFacebookSquare {{\FA\csname faicon@facebook-square\endcsname}} +\expandafter\def\csname faicon@fast-backward\endcsname {\symbol{"F049}} \def\faFastBackward {{\FA\csname faicon@fast-backward\endcsname}} +\expandafter\def\csname faicon@fast-forward\endcsname {\symbol{"F050}} \def\faFastForward {{\FA\csname faicon@fast-forward\endcsname}} +\expandafter\def\csname faicon@fax\endcsname {\symbol{"F1AC}} \def\faFax {{\FA\csname faicon@fax\endcsname}} +\expandafter\def\csname faicon@feed\endcsname {\symbol{"F09E}} \def\faFeed {{\FA\csname faicon@feed\endcsname}} +\expandafter\def\csname faicon@female\endcsname {\symbol{"F182}} \def\faFemale {{\FA\csname faicon@female\endcsname}} +\expandafter\def\csname faicon@fighter-jet\endcsname {\symbol{"F0FB}} \def\faFighterJet {{\FA\csname faicon@fighter-jet\endcsname}} +\expandafter\def\csname faicon@file\endcsname {\symbol{"F15B}} \def\faFile {{\FA\csname faicon@file\endcsname}} +\expandafter\def\csname faicon@file-archive-o\endcsname {\symbol{"F1C6}} \def\faFileArchiveO {{\FA\csname faicon@file-archive-o\endcsname}} +\expandafter\def\csname faicon@file-audio-o\endcsname {\symbol{"F1C7}} \def\faFileAudioO {{\FA\csname faicon@file-audio-o\endcsname}} +\expandafter\def\csname faicon@file-code-o\endcsname {\symbol{"F1C9}} \def\faFileCodeO {{\FA\csname faicon@file-code-o\endcsname}} +\expandafter\def\csname faicon@file-excel-o\endcsname {\symbol{"F1C3}} \def\faFileExcelO {{\FA\csname faicon@file-excel-o\endcsname}} +\expandafter\def\csname faicon@file-image-o\endcsname {\symbol{"F1C5}} \def\faFileImageO {{\FA\csname faicon@file-image-o\endcsname}} +\expandafter\def\csname faicon@file-movie-o\endcsname {\symbol{"F1C8}} \def\faFileMovieO {{\FA\csname faicon@file-movie-o\endcsname}} +\expandafter\def\csname faicon@file-o\endcsname {\symbol{"F016}} \def\faFileO {{\FA\csname faicon@file-o\endcsname}} +\expandafter\def\csname faicon@file-pdf-o\endcsname {\symbol{"F1C1}} \def\faFilePdfO {{\FA\csname faicon@file-pdf-o\endcsname}} +\expandafter\def\csname faicon@file-photo-o\endcsname {\symbol{"F1C5}} \def\faFilePhotoO {{\FA\csname faicon@file-photo-o\endcsname}} +\expandafter\def\csname faicon@file-picture-o\endcsname {\symbol{"F1C5}} \def\faFilePictureO {{\FA\csname faicon@file-picture-o\endcsname}} +\expandafter\def\csname faicon@file-powerpoint-o\endcsname {\symbol{"F1C4}} \def\faFilePowerpointO {{\FA\csname faicon@file-powerpoint-o\endcsname}} +\expandafter\def\csname faicon@file-sound-o\endcsname {\symbol{"F1C7}} \def\faFileSoundO {{\FA\csname faicon@file-sound-o\endcsname}} +\expandafter\def\csname faicon@file-text\endcsname {\symbol{"F15C}} \def\faFileText {{\FA\csname faicon@file-text\endcsname}} +\expandafter\def\csname faicon@file-text-o\endcsname {\symbol{"F0F6}} \def\faFileTextO {{\FA\csname faicon@file-text-o\endcsname}} +\expandafter\def\csname faicon@file-video-o\endcsname {\symbol{"F1C8}} \def\faFileVideoO {{\FA\csname faicon@file-video-o\endcsname}} +\expandafter\def\csname faicon@file-word-o\endcsname {\symbol{"F1C2}} \def\faFileWordO {{\FA\csname faicon@file-word-o\endcsname}} +\expandafter\def\csname faicon@file-zip-o\endcsname {\symbol{"F1C6}} \def\faFileZipO {{\FA\csname faicon@file-zip-o\endcsname}} +\expandafter\def\csname faicon@files-o\endcsname {\symbol{"F0C5}} \def\faFilesO {{\FA\csname faicon@files-o\endcsname}} +\expandafter\def\csname faicon@film\endcsname {\symbol{"F008}} \def\faFilm {{\FA\csname faicon@film\endcsname}} +\expandafter\def\csname faicon@filter\endcsname {\symbol{"F0B0}} \def\faFilter {{\FA\csname faicon@filter\endcsname}} +\expandafter\def\csname faicon@fire\endcsname {\symbol{"F06D}} \def\faFire {{\FA\csname faicon@fire\endcsname}} +\expandafter\def\csname faicon@fire-extinguisher\endcsname {\symbol{"F134}} \def\faFireExtinguisher {{\FA\csname faicon@fire-extinguisher\endcsname}} +\expandafter\def\csname faicon@firefox\endcsname {\symbol{"F269}} \def\faFirefox {{\FA\csname faicon@firefox\endcsname}} +\expandafter\def\csname faicon@flag\endcsname {\symbol{"F024}} \def\faFlag {{\FA\csname faicon@flag\endcsname}} +\expandafter\def\csname faicon@flag-checkered\endcsname {\symbol{"F11E}} \def\faFlagCheckered {{\FA\csname faicon@flag-checkered\endcsname}} +\expandafter\def\csname faicon@flag-o\endcsname {\symbol{"F11D}} \def\faFlagO {{\FA\csname faicon@flag-o\endcsname}} +\expandafter\def\csname faicon@flash\endcsname {\symbol{"F0E7}} \def\faFlash {{\FA\csname faicon@flash\endcsname}} +\expandafter\def\csname faicon@flask\endcsname {\symbol{"F0C3}} \def\faFlask {{\FA\csname faicon@flask\endcsname}} +\expandafter\def\csname faicon@flickr\endcsname {\symbol{"F16E}} \def\faFlickr {{\FA\csname faicon@flickr\endcsname}} +\expandafter\def\csname faicon@floppy-o\endcsname {\symbol{"F0C7}} \def\faFloppyO {{\FA\csname faicon@floppy-o\endcsname}} +\expandafter\def\csname faicon@folder\endcsname {\symbol{"F07B}} \def\faFolder {{\FA\csname faicon@folder\endcsname}} +\expandafter\def\csname faicon@folder-o\endcsname {\symbol{"F114}} \def\faFolderO {{\FA\csname faicon@folder-o\endcsname}} +\expandafter\def\csname faicon@folder-open\endcsname {\symbol{"F07C}} \def\faFolderOpen {{\FA\csname faicon@folder-open\endcsname}} +\expandafter\def\csname faicon@folder-open-o\endcsname {\symbol{"F115}} \def\faFolderOpenO {{\FA\csname faicon@folder-open-o\endcsname}} +\expandafter\def\csname faicon@font\endcsname {\symbol{"F031}} \def\faFont {{\FA\csname faicon@font\endcsname}} +\expandafter\def\csname faicon@fonticons\endcsname {\symbol{"F280}} \def\faFonticons {{\FA\csname faicon@fonticons\endcsname}} +\expandafter\def\csname faicon@forumbee\endcsname {\symbol{"F211}} \def\faForumbee {{\FA\csname faicon@forumbee\endcsname}} +\expandafter\def\csname faicon@forward\endcsname {\symbol{"F04E}} \def\faForward {{\FA\csname faicon@forward\endcsname}} +\expandafter\def\csname faicon@foursquare\endcsname {\symbol{"F180}} \def\faFoursquare {{\FA\csname faicon@foursquare\endcsname}} +\expandafter\def\csname faicon@frown-o\endcsname {\symbol{"F119}} \def\faFrownO {{\FA\csname faicon@frown-o\endcsname}} +\expandafter\def\csname faicon@futbol-o\endcsname {\symbol{"F1E3}} \def\faFutbolO {{\FA\csname faicon@futbol-o\endcsname}} +\expandafter\def\csname faicon@gamepad\endcsname {\symbol{"F11B}} \def\faGamepad {{\FA\csname faicon@gamepad\endcsname}} +\expandafter\def\csname faicon@gavel\endcsname {\symbol{"F0E3}} \def\faGavel {{\FA\csname faicon@gavel\endcsname}} +\expandafter\def\csname faicon@gbp\endcsname {\symbol{"F154}} \def\faGbp {{\FA\csname faicon@gbp\endcsname}} +\expandafter\def\csname faicon@ge\endcsname {\symbol{"F1D1}} \def\faGe {{\FA\csname faicon@ge\endcsname}} +\expandafter\def\csname faicon@gear\endcsname {\symbol{"F013}} \def\faGear {{\FA\csname faicon@gear\endcsname}} +\expandafter\def\csname faicon@gears\endcsname {\symbol{"F085}} \def\faGears {{\FA\csname faicon@gears\endcsname}} +\expandafter\def\csname faicon@genderless\endcsname {\symbol{"F22D}} \def\faGenderless {{\FA\csname faicon@genderless\endcsname}} +\expandafter\def\csname faicon@get-pocket\endcsname {\symbol{"F265}} \def\faGetPocket {{\FA\csname faicon@get-pocket\endcsname}} +\expandafter\def\csname faicon@gg\endcsname {\symbol{"F260}} \def\faGg {{\FA\csname faicon@gg\endcsname}} +\expandafter\def\csname faicon@gg-circle\endcsname {\symbol{"F261}} \def\faGgCircle {{\FA\csname faicon@gg-circle\endcsname}} +\expandafter\def\csname faicon@gift\endcsname {\symbol{"F06B}} \def\faGift {{\FA\csname faicon@gift\endcsname}} +\expandafter\def\csname faicon@git\endcsname {\symbol{"F1D3}} \def\faGit {{\FA\csname faicon@git\endcsname}} +\expandafter\def\csname faicon@git-square\endcsname {\symbol{"F1D2}} \def\faGitSquare {{\FA\csname faicon@git-square\endcsname}} +\expandafter\def\csname faicon@github\endcsname {\symbol{"F09B}} \def\faGithub {{\FA\csname faicon@github\endcsname}} +\expandafter\def\csname faicon@github-alt\endcsname {\symbol{"F113}} \def\faGithubAlt {{\FA\csname faicon@github-alt\endcsname}} +\expandafter\def\csname faicon@github-square\endcsname {\symbol{"F092}} \def\faGithubSquare {{\FA\csname faicon@github-square\endcsname}} +\expandafter\def\csname faicon@gittip\endcsname {\symbol{"F184}} \def\faGittip {{\FA\csname faicon@gittip\endcsname}} +\expandafter\def\csname faicon@glass\endcsname {\symbol{"F000}} \def\faGlass {{\FA\csname faicon@glass\endcsname}} +\expandafter\def\csname faicon@globe\endcsname {\symbol{"F0AC}} \def\faGlobe {{\FA\csname faicon@globe\endcsname}} +\expandafter\def\csname faicon@google\endcsname {\symbol{"F1A0}} \def\faGoogle {{\FA\csname faicon@google\endcsname}} +\expandafter\def\csname faicon@google-plus\endcsname {\symbol{"F0D5}} \def\faGooglePlus {{\FA\csname faicon@google-plus\endcsname}} +\expandafter\def\csname faicon@google-plus-square\endcsname {\symbol{"F0D4}} \def\faGooglePlusSquare {{\FA\csname faicon@google-plus-square\endcsname}} +\expandafter\def\csname faicon@google-wallet\endcsname {\symbol{"F1EE}} \def\faGoogleWallet {{\FA\csname faicon@google-wallet\endcsname}} +\expandafter\def\csname faicon@graduation-cap\endcsname {\symbol{"F19D}} \def\faGraduationCap {{\FA\csname faicon@graduation-cap\endcsname}} +\expandafter\def\csname faicon@gratipay\endcsname {\symbol{"F184}} \def\faGratipay {{\FA\csname faicon@gratipay\endcsname}} +\expandafter\def\csname faicon@group\endcsname {\symbol{"F0C0}} \def\faGroup {{\FA\csname faicon@group\endcsname}} +\expandafter\def\csname faicon@h-square\endcsname {\symbol{"F0FD}} \def\faHSquare {{\FA\csname faicon@h-square\endcsname}} +\expandafter\def\csname faicon@hacker-news\endcsname {\symbol{"F1D4}} \def\faHackerNews {{\FA\csname faicon@hacker-news\endcsname}} +\expandafter\def\csname faicon@hand-grab-o\endcsname {\symbol{"F255}} \def\faHandGrabO {{\FA\csname faicon@hand-grab-o\endcsname}} +\expandafter\def\csname faicon@hand-lizard-o\endcsname {\symbol{"F258}} \def\faHandLizardO {{\FA\csname faicon@hand-lizard-o\endcsname}} +\expandafter\def\csname faicon@hand-o-down\endcsname {\symbol{"F0A7}} \def\faHandODown {{\FA\csname faicon@hand-o-down\endcsname}} +\expandafter\def\csname faicon@hand-o-left\endcsname {\symbol{"F0A5}} \def\faHandOLeft {{\FA\csname faicon@hand-o-left\endcsname}} +\expandafter\def\csname faicon@hand-o-right\endcsname {\symbol{"F0A4}} \def\faHandORight {{\FA\csname faicon@hand-o-right\endcsname}} +\expandafter\def\csname faicon@hand-o-up\endcsname {\symbol{"F0A6}} \def\faHandOUp {{\FA\csname faicon@hand-o-up\endcsname}} +\expandafter\def\csname faicon@hand-paper-o\endcsname {\symbol{"F256}} \def\faHandPaperO {{\FA\csname faicon@hand-paper-o\endcsname}} +\expandafter\def\csname faicon@hand-peace-o\endcsname {\symbol{"F25B}} \def\faHandPeaceO {{\FA\csname faicon@hand-peace-o\endcsname}} +\expandafter\def\csname faicon@hand-pointer-o\endcsname {\symbol{"F25A}} \def\faHandPointerO {{\FA\csname faicon@hand-pointer-o\endcsname}} +\expandafter\def\csname faicon@hand-rock-o\endcsname {\symbol{"F255}} \def\faHandRockO {{\FA\csname faicon@hand-rock-o\endcsname}} +\expandafter\def\csname faicon@hand-scissors-o\endcsname {\symbol{"F257}} \def\faHandScissorsO {{\FA\csname faicon@hand-scissors-o\endcsname}} +\expandafter\def\csname faicon@hand-spock-o\endcsname {\symbol{"F259}} \def\faHandSpockO {{\FA\csname faicon@hand-spock-o\endcsname}} +\expandafter\def\csname faicon@hand-stop-o\endcsname {\symbol{"F256}} \def\faHandStopO {{\FA\csname faicon@hand-stop-o\endcsname}} +\expandafter\def\csname faicon@hdd-o\endcsname {\symbol{"F0A0}} \def\faHddO {{\FA\csname faicon@hdd-o\endcsname}} +\expandafter\def\csname faicon@header\endcsname {\symbol{"F1DC}} \def\faHeader {{\FA\csname faicon@header\endcsname}} +\expandafter\def\csname faicon@headphones\endcsname {\symbol{"F025}} \def\faHeadphones {{\FA\csname faicon@headphones\endcsname}} +\expandafter\def\csname faicon@heart\endcsname {\symbol{"F004}} \def\faHeart {{\FA\csname faicon@heart\endcsname}} +\expandafter\def\csname faicon@heart-o\endcsname {\symbol{"F08A}} \def\faHeartO {{\FA\csname faicon@heart-o\endcsname}} +\expandafter\def\csname faicon@heartbeat\endcsname {\symbol{"F21E}} \def\faHeartbeat {{\FA\csname faicon@heartbeat\endcsname}} +\expandafter\def\csname faicon@history\endcsname {\symbol{"F1DA}} \def\faHistory {{\FA\csname faicon@history\endcsname}} +\expandafter\def\csname faicon@home\endcsname {\symbol{"F015}} \def\faHome {{\FA\csname faicon@home\endcsname}} +\expandafter\def\csname faicon@hospital-o\endcsname {\symbol{"F0F8}} \def\faHospitalO {{\FA\csname faicon@hospital-o\endcsname}} +\expandafter\def\csname faicon@hotel\endcsname {\symbol{"F236}} \def\faHotel {{\FA\csname faicon@hotel\endcsname}} +\expandafter\def\csname faicon@hourglass\endcsname {\symbol{"F254}} \def\faHourglass {{\FA\csname faicon@hourglass\endcsname}} +\expandafter\def\csname faicon@hourglass-end\endcsname {\symbol{"F253}} \def\faHourglassEnd {{\FA\csname faicon@hourglass-end\endcsname}} +\expandafter\def\csname faicon@hourglass-half\endcsname {\symbol{"F252}} \def\faHourglassHalf {{\FA\csname faicon@hourglass-half\endcsname}} +\expandafter\def\csname faicon@hourglass-o\endcsname {\symbol{"F250}} \def\faHourglassO {{\FA\csname faicon@hourglass-o\endcsname}} +\expandafter\def\csname faicon@hourglass-start\endcsname {\symbol{"F251}} \def\faHourglassStart {{\FA\csname faicon@hourglass-start\endcsname}} +\expandafter\def\csname faicon@houzz\endcsname {\symbol{"F27C}} \def\faHouzz {{\FA\csname faicon@houzz\endcsname}} +\expandafter\def\csname faicon@i-cursor\endcsname {\symbol{"F246}} \def\faICursor {{\FA\csname faicon@i-cursor\endcsname}} +\expandafter\def\csname faicon@ils\endcsname {\symbol{"F20B}} \def\faIls {{\FA\csname faicon@ils\endcsname}} +\expandafter\def\csname faicon@image\endcsname {\symbol{"F03E}} \def\faImage {{\FA\csname faicon@image\endcsname}} +\expandafter\def\csname faicon@inbox\endcsname {\symbol{"F01C}} \def\faInbox {{\FA\csname faicon@inbox\endcsname}} +\expandafter\def\csname faicon@indent\endcsname {\symbol{"F03C}} \def\faIndent {{\FA\csname faicon@indent\endcsname}} +\expandafter\def\csname faicon@industry\endcsname {\symbol{"F275}} \def\faIndustry {{\FA\csname faicon@industry\endcsname}} +\expandafter\def\csname faicon@info\endcsname {\symbol{"F129}} \def\faInfo {{\FA\csname faicon@info\endcsname}} +\expandafter\def\csname faicon@info-circle\endcsname {\symbol{"F05A}} \def\faInfoCircle {{\FA\csname faicon@info-circle\endcsname}} +\expandafter\def\csname faicon@inr\endcsname {\symbol{"F156}} \def\faInr {{\FA\csname faicon@inr\endcsname}} +\expandafter\def\csname faicon@instagram\endcsname {\symbol{"F16D}} \def\faInstagram {{\FA\csname faicon@instagram\endcsname}} +\expandafter\def\csname faicon@institution\endcsname {\symbol{"F19C}} \def\faInstitution {{\FA\csname faicon@institution\endcsname}} +\expandafter\def\csname faicon@internet-explorer\endcsname {\symbol{"F26B}} \def\faInternetExplorer {{\FA\csname faicon@internet-explorer\endcsname}} +\expandafter\def\csname faicon@intersex\endcsname {\symbol{"F224}} \def\faIntersex {{\FA\csname faicon@intersex\endcsname}} +\expandafter\def\csname faicon@ioxhost\endcsname {\symbol{"F208}} \def\faIoxhost {{\FA\csname faicon@ioxhost\endcsname}} +\expandafter\def\csname faicon@italic\endcsname {\symbol{"F033}} \def\faItalic {{\FA\csname faicon@italic\endcsname}} +\expandafter\def\csname faicon@joomla\endcsname {\symbol{"F1AA}} \def\faJoomla {{\FA\csname faicon@joomla\endcsname}} +\expandafter\def\csname faicon@jpy\endcsname {\symbol{"F157}} \def\faJpy {{\FA\csname faicon@jpy\endcsname}} +\expandafter\def\csname faicon@jsfiddle\endcsname {\symbol{"F1CC}} \def\faJsfiddle {{\FA\csname faicon@jsfiddle\endcsname}} +\expandafter\def\csname faicon@key\endcsname {\symbol{"F084}} \def\faKey {{\FA\csname faicon@key\endcsname}} +\expandafter\def\csname faicon@keyboard-o\endcsname {\symbol{"F11C}} \def\faKeyboardO {{\FA\csname faicon@keyboard-o\endcsname}} +\expandafter\def\csname faicon@krw\endcsname {\symbol{"F159}} \def\faKrw {{\FA\csname faicon@krw\endcsname}} +\expandafter\def\csname faicon@language\endcsname {\symbol{"F1AB}} \def\faLanguage {{\FA\csname faicon@language\endcsname}} +\expandafter\def\csname faicon@laptop\endcsname {\symbol{"F109}} \def\faLaptop {{\FA\csname faicon@laptop\endcsname}} +\expandafter\def\csname faicon@lastfm\endcsname {\symbol{"F202}} \def\faLastfm {{\FA\csname faicon@lastfm\endcsname}} +\expandafter\def\csname faicon@lastfm-square\endcsname {\symbol{"F203}} \def\faLastfmSquare {{\FA\csname faicon@lastfm-square\endcsname}} +\expandafter\def\csname faicon@leaf\endcsname {\symbol{"F06C}} \def\faLeaf {{\FA\csname faicon@leaf\endcsname}} +\expandafter\def\csname faicon@leanpub\endcsname {\symbol{"F212}} \def\faLeanpub {{\FA\csname faicon@leanpub\endcsname}} +\expandafter\def\csname faicon@legal\endcsname {\symbol{"F0E3}} \def\faLegal {{\FA\csname faicon@legal\endcsname}} +\expandafter\def\csname faicon@lemon-o\endcsname {\symbol{"F094}} \def\faLemonO {{\FA\csname faicon@lemon-o\endcsname}} +\expandafter\def\csname faicon@level-down\endcsname {\symbol{"F149}} \def\faLevelDown {{\FA\csname faicon@level-down\endcsname}} +\expandafter\def\csname faicon@level-up\endcsname {\symbol{"F148}} \def\faLevelUp {{\FA\csname faicon@level-up\endcsname}} +\expandafter\def\csname faicon@life-bouy\endcsname {\symbol{"F1CD}} \def\faLifeBouy {{\FA\csname faicon@life-bouy\endcsname}} +\expandafter\def\csname faicon@life-buoy\endcsname {\symbol{"F1CD}} \def\faLifeBuoy {{\FA\csname faicon@life-buoy\endcsname}} +\expandafter\def\csname faicon@life-ring\endcsname {\symbol{"F1CD}} \def\faLifeRing {{\FA\csname faicon@life-ring\endcsname}} +\expandafter\def\csname faicon@life-saver\endcsname {\symbol{"F1CD}} \def\faLifeSaver {{\FA\csname faicon@life-saver\endcsname}} +\expandafter\def\csname faicon@lightbulb-o\endcsname {\symbol{"F0EB}} \def\faLightbulbO {{\FA\csname faicon@lightbulb-o\endcsname}} +\expandafter\def\csname faicon@line-chart\endcsname {\symbol{"F201}} \def\faLineChart {{\FA\csname faicon@line-chart\endcsname}} +\expandafter\def\csname faicon@link\endcsname {\symbol{"F0C1}} \def\faLink {{\FA\csname faicon@link\endcsname}} +\expandafter\def\csname faicon@linkedin\endcsname {\symbol{"F0E1}} \def\faLinkedin {{\FA\csname faicon@linkedin\endcsname}} +\expandafter\def\csname faicon@linkedin-square\endcsname {\symbol{"F08C}} \def\faLinkedinSquare {{\FA\csname faicon@linkedin-square\endcsname}} +\expandafter\def\csname faicon@linux\endcsname {\symbol{"F17C}} \def\faLinux {{\FA\csname faicon@linux\endcsname}} +\expandafter\def\csname faicon@list\endcsname {\symbol{"F03A}} \def\faList {{\FA\csname faicon@list\endcsname}} +\expandafter\def\csname faicon@list-alt\endcsname {\symbol{"F022}} \def\faListAlt {{\FA\csname faicon@list-alt\endcsname}} +\expandafter\def\csname faicon@list-ol\endcsname {\symbol{"F0CB}} \def\faListOl {{\FA\csname faicon@list-ol\endcsname}} +\expandafter\def\csname faicon@list-ul\endcsname {\symbol{"F0CA}} \def\faListUl {{\FA\csname faicon@list-ul\endcsname}} +\expandafter\def\csname faicon@location-arrow\endcsname {\symbol{"F124}} \def\faLocationArrow {{\FA\csname faicon@location-arrow\endcsname}} +\expandafter\def\csname faicon@lock\endcsname {\symbol{"F023}} \def\faLock {{\FA\csname faicon@lock\endcsname}} +\expandafter\def\csname faicon@long-arrow-down\endcsname {\symbol{"F175}} \def\faLongArrowDown {{\FA\csname faicon@long-arrow-down\endcsname}} +\expandafter\def\csname faicon@long-arrow-left\endcsname {\symbol{"F177}} \def\faLongArrowLeft {{\FA\csname faicon@long-arrow-left\endcsname}} +\expandafter\def\csname faicon@long-arrow-right\endcsname {\symbol{"F178}} \def\faLongArrowRight {{\FA\csname faicon@long-arrow-right\endcsname}} +\expandafter\def\csname faicon@long-arrow-up\endcsname {\symbol{"F176}} \def\faLongArrowUp {{\FA\csname faicon@long-arrow-up\endcsname}} +\expandafter\def\csname faicon@magic\endcsname {\symbol{"F0D0}} \def\faMagic {{\FA\csname faicon@magic\endcsname}} +\expandafter\def\csname faicon@magnet\endcsname {\symbol{"F076}} \def\faMagnet {{\FA\csname faicon@magnet\endcsname}} +\expandafter\def\csname faicon@mail-forward\endcsname {\symbol{"F064}} \def\faMailForward {{\FA\csname faicon@mail-forward\endcsname}} +\expandafter\def\csname faicon@mail-reply\endcsname {\symbol{"F112}} \def\faMailReply {{\FA\csname faicon@mail-reply\endcsname}} +\expandafter\def\csname faicon@mail-reply-all\endcsname {\symbol{"F122}} \def\faMailReplyAll {{\FA\csname faicon@mail-reply-all\endcsname}} +\expandafter\def\csname faicon@male\endcsname {\symbol{"F183}} \def\faMale {{\FA\csname faicon@male\endcsname}} +\expandafter\def\csname faicon@map\endcsname {\symbol{"F279}} \def\faMap {{\FA\csname faicon@map\endcsname}} +\expandafter\def\csname faicon@map-marker\endcsname {\symbol{"F041}} \def\faMapMarker {{\FA\csname faicon@map-marker\endcsname}} +\expandafter\def\csname faicon@map-o\endcsname {\symbol{"F278}} \def\faMapO {{\FA\csname faicon@map-o\endcsname}} +\expandafter\def\csname faicon@map-pin\endcsname {\symbol{"F276}} \def\faMapPin {{\FA\csname faicon@map-pin\endcsname}} +\expandafter\def\csname faicon@map-signs\endcsname {\symbol{"F277}} \def\faMapSigns {{\FA\csname faicon@map-signs\endcsname}} +\expandafter\def\csname faicon@mars\endcsname {\symbol{"F222}} \def\faMars {{\FA\csname faicon@mars\endcsname}} +\expandafter\def\csname faicon@mars-double\endcsname {\symbol{"F227}} \def\faMarsDouble {{\FA\csname faicon@mars-double\endcsname}} +\expandafter\def\csname faicon@mars-stroke\endcsname {\symbol{"F229}} \def\faMarsStroke {{\FA\csname faicon@mars-stroke\endcsname}} +\expandafter\def\csname faicon@mars-stroke-h\endcsname {\symbol{"F22B}} \def\faMarsStrokeH {{\FA\csname faicon@mars-stroke-h\endcsname}} +\expandafter\def\csname faicon@mars-stroke-v\endcsname {\symbol{"F22A}} \def\faMarsStrokeV {{\FA\csname faicon@mars-stroke-v\endcsname}} +\expandafter\def\csname faicon@maxcdn\endcsname {\symbol{"F136}} \def\faMaxcdn {{\FA\csname faicon@maxcdn\endcsname}} +\expandafter\def\csname faicon@meanpath\endcsname {\symbol{"F20C}} \def\faMeanpath {{\FA\csname faicon@meanpath\endcsname}} +\expandafter\def\csname faicon@medium\endcsname {\symbol{"F23A}} \def\faMedium {{\FA\csname faicon@medium\endcsname}} +\expandafter\def\csname faicon@medkit\endcsname {\symbol{"F0FA}} \def\faMedkit {{\FA\csname faicon@medkit\endcsname}} +\expandafter\def\csname faicon@meh-o\endcsname {\symbol{"F11A}} \def\faMehO {{\FA\csname faicon@meh-o\endcsname}} +\expandafter\def\csname faicon@mercury\endcsname {\symbol{"F223}} \def\faMercury {{\FA\csname faicon@mercury\endcsname}} +\expandafter\def\csname faicon@microphone\endcsname {\symbol{"F130}} \def\faMicrophone {{\FA\csname faicon@microphone\endcsname}} +\expandafter\def\csname faicon@microphone-slash\endcsname {\symbol{"F131}} \def\faMicrophoneSlash {{\FA\csname faicon@microphone-slash\endcsname}} +\expandafter\def\csname faicon@minus\endcsname {\symbol{"F068}} \def\faMinus {{\FA\csname faicon@minus\endcsname}} +\expandafter\def\csname faicon@minus-circle\endcsname {\symbol{"F056}} \def\faMinusCircle {{\FA\csname faicon@minus-circle\endcsname}} +\expandafter\def\csname faicon@minus-square\endcsname {\symbol{"F146}} \def\faMinusSquare {{\FA\csname faicon@minus-square\endcsname}} +\expandafter\def\csname faicon@minus-square-o\endcsname {\symbol{"F147}} \def\faMinusSquareO {{\FA\csname faicon@minus-square-o\endcsname}} +\expandafter\def\csname faicon@mobile\endcsname {\symbol{"F10B}} \def\faMobile {{\FA\csname faicon@mobile\endcsname}} +\expandafter\def\csname faicon@mobile-phone\endcsname {\symbol{"F10B}} \def\faMobilePhone {{\FA\csname faicon@mobile-phone\endcsname}} +\expandafter\def\csname faicon@money\endcsname {\symbol{"F0D6}} \def\faMoney {{\FA\csname faicon@money\endcsname}} +\expandafter\def\csname faicon@moon-o\endcsname {\symbol{"F186}} \def\faMoonO {{\FA\csname faicon@moon-o\endcsname}} +\expandafter\def\csname faicon@mortar-board\endcsname {\symbol{"F19D}} \def\faMortarBoard {{\FA\csname faicon@mortar-board\endcsname}} +\expandafter\def\csname faicon@motorcycle\endcsname {\symbol{"F21C}} \def\faMotorcycle {{\FA\csname faicon@motorcycle\endcsname}} +\expandafter\def\csname faicon@mouse-pointer\endcsname {\symbol{"F245}} \def\faMousePointer {{\FA\csname faicon@mouse-pointer\endcsname}} +\expandafter\def\csname faicon@music\endcsname {\symbol{"F001}} \def\faMusic {{\FA\csname faicon@music\endcsname}} +\expandafter\def\csname faicon@navicon\endcsname {\symbol{"F0C9}} \def\faNavicon {{\FA\csname faicon@navicon\endcsname}} +\expandafter\def\csname faicon@neuter\endcsname {\symbol{"F22C}} \def\faNeuter {{\FA\csname faicon@neuter\endcsname}} +\expandafter\def\csname faicon@newspaper-o\endcsname {\symbol{"F1EA}} \def\faNewspaperO {{\FA\csname faicon@newspaper-o\endcsname}} +\expandafter\def\csname faicon@object-group\endcsname {\symbol{"F247}} \def\faObjectGroup {{\FA\csname faicon@object-group\endcsname}} +\expandafter\def\csname faicon@object-ungroup\endcsname {\symbol{"F248}} \def\faObjectUngroup {{\FA\csname faicon@object-ungroup\endcsname}} +\expandafter\def\csname faicon@odnoklassniki\endcsname {\symbol{"F263}} \def\faOdnoklassniki {{\FA\csname faicon@odnoklassniki\endcsname}} +\expandafter\def\csname faicon@odnoklassniki-square\endcsname {\symbol{"F264}} \def\faOdnoklassnikiSquare {{\FA\csname faicon@odnoklassniki-square\endcsname}} +\expandafter\def\csname faicon@opencart\endcsname {\symbol{"F23D}} \def\faOpencart {{\FA\csname faicon@opencart\endcsname}} +\expandafter\def\csname faicon@openid\endcsname {\symbol{"F19B}} \def\faOpenid {{\FA\csname faicon@openid\endcsname}} +\expandafter\def\csname faicon@opera\endcsname {\symbol{"F26A}} \def\faOpera {{\FA\csname faicon@opera\endcsname}} +\expandafter\def\csname faicon@optin-monster\endcsname {\symbol{"F23C}} \def\faOptinMonster {{\FA\csname faicon@optin-monster\endcsname}} +\expandafter\def\csname faicon@outdent\endcsname {\symbol{"F03B}} \def\faOutdent {{\FA\csname faicon@outdent\endcsname}} +\expandafter\def\csname faicon@pagelines\endcsname {\symbol{"F18C}} \def\faPagelines {{\FA\csname faicon@pagelines\endcsname}} +\expandafter\def\csname faicon@paint-brush\endcsname {\symbol{"F1FC}} \def\faPaintBrush {{\FA\csname faicon@paint-brush\endcsname}} +\expandafter\def\csname faicon@paper-plane\endcsname {\symbol{"F1D8}} \def\faPaperPlane {{\FA\csname faicon@paper-plane\endcsname}} +\expandafter\def\csname faicon@paper-plane-o\endcsname {\symbol{"F1D9}} \def\faPaperPlaneO {{\FA\csname faicon@paper-plane-o\endcsname}} +\expandafter\def\csname faicon@paperclip\endcsname {\symbol{"F0C6}} \def\faPaperclip {{\FA\csname faicon@paperclip\endcsname}} +\expandafter\def\csname faicon@paragraph\endcsname {\symbol{"F1DD}} \def\faParagraph {{\FA\csname faicon@paragraph\endcsname}} +\expandafter\def\csname faicon@paste\endcsname {\symbol{"F0EA}} \def\faPaste {{\FA\csname faicon@paste\endcsname}} +\expandafter\def\csname faicon@pause\endcsname {\symbol{"F04C}} \def\faPause {{\FA\csname faicon@pause\endcsname}} +\expandafter\def\csname faicon@paw\endcsname {\symbol{"F1B0}} \def\faPaw {{\FA\csname faicon@paw\endcsname}} +\expandafter\def\csname faicon@paypal\endcsname {\symbol{"F1ED}} \def\faPaypal {{\FA\csname faicon@paypal\endcsname}} +\expandafter\def\csname faicon@pencil\endcsname {\symbol{"F040}} \def\faPencil {{\FA\csname faicon@pencil\endcsname}} +\expandafter\def\csname faicon@pencil-square\endcsname {\symbol{"F14B}} \def\faPencilSquare {{\FA\csname faicon@pencil-square\endcsname}} +\expandafter\def\csname faicon@pencil-square-o\endcsname {\symbol{"F044}} \def\faPencilSquareO {{\FA\csname faicon@pencil-square-o\endcsname}} +\expandafter\def\csname faicon@phone\endcsname {\symbol{"F095}} \def\faPhone {{\FA\csname faicon@phone\endcsname}} +\expandafter\def\csname faicon@phone-square\endcsname {\symbol{"F098}} \def\faPhoneSquare {{\FA\csname faicon@phone-square\endcsname}} +\expandafter\def\csname faicon@photo\endcsname {\symbol{"F03E}} \def\faPhoto {{\FA\csname faicon@photo\endcsname}} +\expandafter\def\csname faicon@picture-o\endcsname {\symbol{"F03E}} \def\faPictureO {{\FA\csname faicon@picture-o\endcsname}} +\expandafter\def\csname faicon@pie-chart\endcsname {\symbol{"F200}} \def\faPieChart {{\FA\csname faicon@pie-chart\endcsname}} +\expandafter\def\csname faicon@pied-piper\endcsname {\symbol{"F1A7}} \def\faPiedPiper {{\FA\csname faicon@pied-piper\endcsname}} +\expandafter\def\csname faicon@pied-piper-alt\endcsname {\symbol{"F1A8}} \def\faPiedPiperAlt {{\FA\csname faicon@pied-piper-alt\endcsname}} +\expandafter\def\csname faicon@pinterest\endcsname {\symbol{"F0D2}} \def\faPinterest {{\FA\csname faicon@pinterest\endcsname}} +\expandafter\def\csname faicon@pinterest-p\endcsname {\symbol{"F231}} \def\faPinterestP {{\FA\csname faicon@pinterest-p\endcsname}} +\expandafter\def\csname faicon@pinterest-square\endcsname {\symbol{"F0D3}} \def\faPinterestSquare {{\FA\csname faicon@pinterest-square\endcsname}} +\expandafter\def\csname faicon@plane\endcsname {\symbol{"F072}} \def\faPlane {{\FA\csname faicon@plane\endcsname}} +\expandafter\def\csname faicon@play\endcsname {\symbol{"F04B}} \def\faPlay {{\FA\csname faicon@play\endcsname}} +\expandafter\def\csname faicon@play-circle\endcsname {\symbol{"F144}} \def\faPlayCircle {{\FA\csname faicon@play-circle\endcsname}} +\expandafter\def\csname faicon@play-circle-o\endcsname {\symbol{"F01D}} \def\faPlayCircleO {{\FA\csname faicon@play-circle-o\endcsname}} +\expandafter\def\csname faicon@plug\endcsname {\symbol{"F1E6}} \def\faPlug {{\FA\csname faicon@plug\endcsname}} +\expandafter\def\csname faicon@plus\endcsname {\symbol{"F067}} \def\faPlus {{\FA\csname faicon@plus\endcsname}} +\expandafter\def\csname faicon@plus-circle\endcsname {\symbol{"F055}} \def\faPlusCircle {{\FA\csname faicon@plus-circle\endcsname}} +\expandafter\def\csname faicon@plus-square\endcsname {\symbol{"F0FE}} \def\faPlusSquare {{\FA\csname faicon@plus-square\endcsname}} +\expandafter\def\csname faicon@plus-square-o\endcsname {\symbol{"F196}} \def\faPlusSquareO {{\FA\csname faicon@plus-square-o\endcsname}} +\expandafter\def\csname faicon@power-off\endcsname {\symbol{"F011}} \def\faPowerOff {{\FA\csname faicon@power-off\endcsname}} +\expandafter\def\csname faicon@print\endcsname {\symbol{"F02F}} \def\faPrint {{\FA\csname faicon@print\endcsname}} +\expandafter\def\csname faicon@puzzle-piece\endcsname {\symbol{"F12E}} \def\faPuzzlePiece {{\FA\csname faicon@puzzle-piece\endcsname}} +\expandafter\def\csname faicon@qq\endcsname {\symbol{"F1D6}} \def\faQq {{\FA\csname faicon@qq\endcsname}} +\expandafter\def\csname faicon@qrcode\endcsname {\symbol{"F029}} \def\faQrcode {{\FA\csname faicon@qrcode\endcsname}} +\expandafter\def\csname faicon@question\endcsname {\symbol{"F128}} \def\faQuestion {{\FA\csname faicon@question\endcsname}} +\expandafter\def\csname faicon@question-circle\endcsname {\symbol{"F059}} \def\faQuestionCircle {{\FA\csname faicon@question-circle\endcsname}} +\expandafter\def\csname faicon@quote-left\endcsname {\symbol{"F10D}} \def\faQuoteLeft {{\FA\csname faicon@quote-left\endcsname}} +\expandafter\def\csname faicon@quote-right\endcsname {\symbol{"F10E}} \def\faQuoteRight {{\FA\csname faicon@quote-right\endcsname}} +\expandafter\def\csname faicon@ra\endcsname {\symbol{"F1D0}} \def\faRa {{\FA\csname faicon@ra\endcsname}} +\expandafter\def\csname faicon@random\endcsname {\symbol{"F074}} \def\faRandom {{\FA\csname faicon@random\endcsname}} +\expandafter\def\csname faicon@rebel\endcsname {\symbol{"F1D0}} \def\faRebel {{\FA\csname faicon@rebel\endcsname}} +\expandafter\def\csname faicon@recycle\endcsname {\symbol{"F1B8}} \def\faRecycle {{\FA\csname faicon@recycle\endcsname}} +\expandafter\def\csname faicon@reddit\endcsname {\symbol{"F1A1}} \def\faReddit {{\FA\csname faicon@reddit\endcsname}} +\expandafter\def\csname faicon@reddit-square\endcsname {\symbol{"F1A2}} \def\faRedditSquare {{\FA\csname faicon@reddit-square\endcsname}} +\expandafter\def\csname faicon@refresh\endcsname {\symbol{"F021}} \def\faRefresh {{\FA\csname faicon@refresh\endcsname}} +\expandafter\def\csname faicon@registered\endcsname {\symbol{"F25D}} \def\faRegistered {{\FA\csname faicon@registered\endcsname}} +\expandafter\def\csname faicon@remove\endcsname {\symbol{"F00D}} \def\faRemove {{\FA\csname faicon@remove\endcsname}} +\expandafter\def\csname faicon@renren\endcsname {\symbol{"F18B}} \def\faRenren {{\FA\csname faicon@renren\endcsname}} +\expandafter\def\csname faicon@reorder\endcsname {\symbol{"F0C9}} \def\faReorder {{\FA\csname faicon@reorder\endcsname}} +\expandafter\def\csname faicon@repeat\endcsname {\symbol{"F01E}} \def\faRepeat {{\FA\csname faicon@repeat\endcsname}} +\expandafter\def\csname faicon@reply\endcsname {\symbol{"F112}} \def\faReply {{\FA\csname faicon@reply\endcsname}} +\expandafter\def\csname faicon@reply-all\endcsname {\symbol{"F122}} \def\faReplyAll {{\FA\csname faicon@reply-all\endcsname}} +\expandafter\def\csname faicon@retweet\endcsname {\symbol{"F079}} \def\faRetweet {{\FA\csname faicon@retweet\endcsname}} +\expandafter\def\csname faicon@rmb\endcsname {\symbol{"F157}} \def\faRmb {{\FA\csname faicon@rmb\endcsname}} +\expandafter\def\csname faicon@road\endcsname {\symbol{"F018}} \def\faRoad {{\FA\csname faicon@road\endcsname}} +\expandafter\def\csname faicon@rocket\endcsname {\symbol{"F135}} \def\faRocket {{\FA\csname faicon@rocket\endcsname}} +\expandafter\def\csname faicon@rotate-left\endcsname {\symbol{"F0E2}} \def\faRotateLeft {{\FA\csname faicon@rotate-left\endcsname}} +\expandafter\def\csname faicon@rotate-right\endcsname {\symbol{"F01E}} \def\faRotateRight {{\FA\csname faicon@rotate-right\endcsname}} +\expandafter\def\csname faicon@rouble\endcsname {\symbol{"F158}} \def\faRouble {{\FA\csname faicon@rouble\endcsname}} +\expandafter\def\csname faicon@rss\endcsname {\symbol{"F09E}} \def\faRss {{\FA\csname faicon@rss\endcsname}} +\expandafter\def\csname faicon@rss-square\endcsname {\symbol{"F143}} \def\faRssSquare {{\FA\csname faicon@rss-square\endcsname}} +\expandafter\def\csname faicon@rub\endcsname {\symbol{"F158}} \def\faRub {{\FA\csname faicon@rub\endcsname}} +\expandafter\def\csname faicon@ruble\endcsname {\symbol{"F158}} \def\faRuble {{\FA\csname faicon@ruble\endcsname}} +\expandafter\def\csname faicon@rupee\endcsname {\symbol{"F156}} \def\faRupee {{\FA\csname faicon@rupee\endcsname}} +\expandafter\def\csname faicon@safari\endcsname {\symbol{"F267}} \def\faSafari {{\FA\csname faicon@safari\endcsname}} +\expandafter\def\csname faicon@save\endcsname {\symbol{"F0C7}} \def\faSave {{\FA\csname faicon@save\endcsname}} +\expandafter\def\csname faicon@scissors\endcsname {\symbol{"F0C4}} \def\faScissors {{\FA\csname faicon@scissors\endcsname}} +\expandafter\def\csname faicon@search\endcsname {\symbol{"F002}} \def\faSearch {{\FA\csname faicon@search\endcsname}} +\expandafter\def\csname faicon@search-minus\endcsname {\symbol{"F010}} \def\faSearchMinus {{\FA\csname faicon@search-minus\endcsname}} +\expandafter\def\csname faicon@search-plus\endcsname {\symbol{"F00E}} \def\faSearchPlus {{\FA\csname faicon@search-plus\endcsname}} +\expandafter\def\csname faicon@sellsy\endcsname {\symbol{"F213}} \def\faSellsy {{\FA\csname faicon@sellsy\endcsname}} +\expandafter\def\csname faicon@send\endcsname {\symbol{"F1D8}} \def\faSend {{\FA\csname faicon@send\endcsname}} +\expandafter\def\csname faicon@send-o\endcsname {\symbol{"F1D9}} \def\faSendO {{\FA\csname faicon@send-o\endcsname}} +\expandafter\def\csname faicon@server\endcsname {\symbol{"F233}} \def\faServer {{\FA\csname faicon@server\endcsname}} +\expandafter\def\csname faicon@share\endcsname {\symbol{"F064}} \def\faShare {{\FA\csname faicon@share\endcsname}} +\expandafter\def\csname faicon@share-alt\endcsname {\symbol{"F1E0}} \def\faShareAlt {{\FA\csname faicon@share-alt\endcsname}} +\expandafter\def\csname faicon@share-alt-square\endcsname {\symbol{"F1E1}} \def\faShareAltSquare {{\FA\csname faicon@share-alt-square\endcsname}} +\expandafter\def\csname faicon@share-square\endcsname {\symbol{"F14D}} \def\faShareSquare {{\FA\csname faicon@share-square\endcsname}} +\expandafter\def\csname faicon@share-square-o\endcsname {\symbol{"F045}} \def\faShareSquareO {{\FA\csname faicon@share-square-o\endcsname}} +\expandafter\def\csname faicon@shekel\endcsname {\symbol{"F20B}} \def\faShekel {{\FA\csname faicon@shekel\endcsname}} +\expandafter\def\csname faicon@sheqel\endcsname {\symbol{"F20B}} \def\faSheqel {{\FA\csname faicon@sheqel\endcsname}} +\expandafter\def\csname faicon@shield\endcsname {\symbol{"F132}} \def\faShield {{\FA\csname faicon@shield\endcsname}} +\expandafter\def\csname faicon@ship\endcsname {\symbol{"F21A}} \def\faShip {{\FA\csname faicon@ship\endcsname}} +\expandafter\def\csname faicon@shirtsinbulk\endcsname {\symbol{"F214}} \def\faShirtsinbulk {{\FA\csname faicon@shirtsinbulk\endcsname}} +\expandafter\def\csname faicon@shopping-cart\endcsname {\symbol{"F07A}} \def\faShoppingCart {{\FA\csname faicon@shopping-cart\endcsname}} +\expandafter\def\csname faicon@sign-in\endcsname {\symbol{"F090}} \def\faSignIn {{\FA\csname faicon@sign-in\endcsname}} +\expandafter\def\csname faicon@sign-out\endcsname {\symbol{"F08B}} \def\faSignOut {{\FA\csname faicon@sign-out\endcsname}} +\expandafter\def\csname faicon@signal\endcsname {\symbol{"F012}} \def\faSignal {{\FA\csname faicon@signal\endcsname}} +\expandafter\def\csname faicon@simplybuilt\endcsname {\symbol{"F215}} \def\faSimplybuilt {{\FA\csname faicon@simplybuilt\endcsname}} +\expandafter\def\csname faicon@sitemap\endcsname {\symbol{"F0E8}} \def\faSitemap {{\FA\csname faicon@sitemap\endcsname}} +\expandafter\def\csname faicon@skyatlas\endcsname {\symbol{"F216}} \def\faSkyatlas {{\FA\csname faicon@skyatlas\endcsname}} +\expandafter\def\csname faicon@skype\endcsname {\symbol{"F17E}} \def\faSkype {{\FA\csname faicon@skype\endcsname}} +\expandafter\def\csname faicon@slack\endcsname {\symbol{"F198}} \def\faSlack {{\FA\csname faicon@slack\endcsname}} +\expandafter\def\csname faicon@sliders\endcsname {\symbol{"F1DE}} \def\faSliders {{\FA\csname faicon@sliders\endcsname}} +\expandafter\def\csname faicon@slideshare\endcsname {\symbol{"F1E7}} \def\faSlideshare {{\FA\csname faicon@slideshare\endcsname}} +\expandafter\def\csname faicon@smile-o\endcsname {\symbol{"F118}} \def\faSmileO {{\FA\csname faicon@smile-o\endcsname}} +\expandafter\def\csname faicon@soccer-ball-o\endcsname {\symbol{"F1E3}} \def\faSoccerBallO {{\FA\csname faicon@soccer-ball-o\endcsname}} +\expandafter\def\csname faicon@sort\endcsname {\symbol{"F0DC}} \def\faSort {{\FA\csname faicon@sort\endcsname}} +\expandafter\def\csname faicon@sort-alpha-asc\endcsname {\symbol{"F15D}} \def\faSortAlphaAsc {{\FA\csname faicon@sort-alpha-asc\endcsname}} +\expandafter\def\csname faicon@sort-alpha-desc\endcsname {\symbol{"F15E}} \def\faSortAlphaDesc {{\FA\csname faicon@sort-alpha-desc\endcsname}} +\expandafter\def\csname faicon@sort-amount-asc\endcsname {\symbol{"F160}} \def\faSortAmountAsc {{\FA\csname faicon@sort-amount-asc\endcsname}} +\expandafter\def\csname faicon@sort-amount-desc\endcsname {\symbol{"F161}} \def\faSortAmountDesc {{\FA\csname faicon@sort-amount-desc\endcsname}} +\expandafter\def\csname faicon@sort-asc\endcsname {\symbol{"F0DE}} \def\faSortAsc {{\FA\csname faicon@sort-asc\endcsname}} +\expandafter\def\csname faicon@sort-desc\endcsname {\symbol{"F0DD}} \def\faSortDesc {{\FA\csname faicon@sort-desc\endcsname}} +\expandafter\def\csname faicon@sort-down\endcsname {\symbol{"F0DD}} \def\faSortDown {{\FA\csname faicon@sort-down\endcsname}} +\expandafter\def\csname faicon@sort-numeric-asc\endcsname {\symbol{"F162}} \def\faSortNumericAsc {{\FA\csname faicon@sort-numeric-asc\endcsname}} +\expandafter\def\csname faicon@sort-numeric-desc\endcsname {\symbol{"F163}} \def\faSortNumericDesc {{\FA\csname faicon@sort-numeric-desc\endcsname}} +\expandafter\def\csname faicon@sort-up\endcsname {\symbol{"F0DE}} \def\faSortUp {{\FA\csname faicon@sort-up\endcsname}} +\expandafter\def\csname faicon@soundcloud\endcsname {\symbol{"F1BE}} \def\faSoundcloud {{\FA\csname faicon@soundcloud\endcsname}} +\expandafter\def\csname faicon@space-shuttle\endcsname {\symbol{"F197}} \def\faSpaceShuttle {{\FA\csname faicon@space-shuttle\endcsname}} +\expandafter\def\csname faicon@spinner\endcsname {\symbol{"F110}} \def\faSpinner {{\FA\csname faicon@spinner\endcsname}} +\expandafter\def\csname faicon@spoon\endcsname {\symbol{"F1B1}} \def\faSpoon {{\FA\csname faicon@spoon\endcsname}} +\expandafter\def\csname faicon@spotify\endcsname {\symbol{"F1BC}} \def\faSpotify {{\FA\csname faicon@spotify\endcsname}} +\expandafter\def\csname faicon@square\endcsname {\symbol{"F0C8}} \def\faSquare {{\FA\csname faicon@square\endcsname}} +\expandafter\def\csname faicon@square-o\endcsname {\symbol{"F096}} \def\faSquareO {{\FA\csname faicon@square-o\endcsname}} +\expandafter\def\csname faicon@stack-exchange\endcsname {\symbol{"F18D}} \def\faStackExchange {{\FA\csname faicon@stack-exchange\endcsname}} +\expandafter\def\csname faicon@stack-overflow\endcsname {\symbol{"F16C}} \def\faStackOverflow {{\FA\csname faicon@stack-overflow\endcsname}} +\expandafter\def\csname faicon@star\endcsname {\symbol{"F005}} \def\faStar {{\FA\csname faicon@star\endcsname}} +\expandafter\def\csname faicon@star-half\endcsname {\symbol{"F089}} \def\faStarHalf {{\FA\csname faicon@star-half\endcsname}} +\expandafter\def\csname faicon@star-half-empty\endcsname {\symbol{"F123}} \def\faStarHalfEmpty {{\FA\csname faicon@star-half-empty\endcsname}} +\expandafter\def\csname faicon@star-half-full\endcsname {\symbol{"F123}} \def\faStarHalfFull {{\FA\csname faicon@star-half-full\endcsname}} +\expandafter\def\csname faicon@star-half-o\endcsname {\symbol{"F123}} \def\faStarHalfO {{\FA\csname faicon@star-half-o\endcsname}} +\expandafter\def\csname faicon@star-o\endcsname {\symbol{"F006}} \def\faStarO {{\FA\csname faicon@star-o\endcsname}} +\expandafter\def\csname faicon@steam\endcsname {\symbol{"F1B6}} \def\faSteam {{\FA\csname faicon@steam\endcsname}} +\expandafter\def\csname faicon@steam-square\endcsname {\symbol{"F1B7}} \def\faSteamSquare {{\FA\csname faicon@steam-square\endcsname}} +\expandafter\def\csname faicon@step-backward\endcsname {\symbol{"F048}} \def\faStepBackward {{\FA\csname faicon@step-backward\endcsname}} +\expandafter\def\csname faicon@step-forward\endcsname {\symbol{"F051}} \def\faStepForward {{\FA\csname faicon@step-forward\endcsname}} +\expandafter\def\csname faicon@stethoscope\endcsname {\symbol{"F0F1}} \def\faStethoscope {{\FA\csname faicon@stethoscope\endcsname}} +\expandafter\def\csname faicon@sticky-note\endcsname {\symbol{"F249}} \def\faStickyNote {{\FA\csname faicon@sticky-note\endcsname}} +\expandafter\def\csname faicon@sticky-note-o\endcsname {\symbol{"F24A}} \def\faStickyNoteO {{\FA\csname faicon@sticky-note-o\endcsname}} +\expandafter\def\csname faicon@stop\endcsname {\symbol{"F04D}} \def\faStop {{\FA\csname faicon@stop\endcsname}} +\expandafter\def\csname faicon@street-view\endcsname {\symbol{"F21D}} \def\faStreetView {{\FA\csname faicon@street-view\endcsname}} +\expandafter\def\csname faicon@strikethrough\endcsname {\symbol{"F0CC}} \def\faStrikethrough {{\FA\csname faicon@strikethrough\endcsname}} +\expandafter\def\csname faicon@stumbleupon\endcsname {\symbol{"F1A4}} \def\faStumbleupon {{\FA\csname faicon@stumbleupon\endcsname}} +\expandafter\def\csname faicon@stumbleupon-circle\endcsname {\symbol{"F1A3}} \def\faStumbleuponCircle {{\FA\csname faicon@stumbleupon-circle\endcsname}} +\expandafter\def\csname faicon@subscript\endcsname {\symbol{"F12C}} \def\faSubscript {{\FA\csname faicon@subscript\endcsname}} +\expandafter\def\csname faicon@subway\endcsname {\symbol{"F239}} \def\faSubway {{\FA\csname faicon@subway\endcsname}} +\expandafter\def\csname faicon@suitcase\endcsname {\symbol{"F0F2}} \def\faSuitcase {{\FA\csname faicon@suitcase\endcsname}} +\expandafter\def\csname faicon@sun-o\endcsname {\symbol{"F185}} \def\faSunO {{\FA\csname faicon@sun-o\endcsname}} +\expandafter\def\csname faicon@superscript\endcsname {\symbol{"F12B}} \def\faSuperscript {{\FA\csname faicon@superscript\endcsname}} +\expandafter\def\csname faicon@support\endcsname {\symbol{"F1CD}} \def\faSupport {{\FA\csname faicon@support\endcsname}} +\expandafter\def\csname faicon@table\endcsname {\symbol{"F0CE}} \def\faTable {{\FA\csname faicon@table\endcsname}} +\expandafter\def\csname faicon@tablet\endcsname {\symbol{"F10A}} \def\faTablet {{\FA\csname faicon@tablet\endcsname}} +\expandafter\def\csname faicon@tachometer\endcsname {\symbol{"F0E4}} \def\faTachometer {{\FA\csname faicon@tachometer\endcsname}} +\expandafter\def\csname faicon@tag\endcsname {\symbol{"F02B}} \def\faTag {{\FA\csname faicon@tag\endcsname}} +\expandafter\def\csname faicon@tags\endcsname {\symbol{"F02C}} \def\faTags {{\FA\csname faicon@tags\endcsname}} +\expandafter\def\csname faicon@tasks\endcsname {\symbol{"F0AE}} \def\faTasks {{\FA\csname faicon@tasks\endcsname}} +\expandafter\def\csname faicon@taxi\endcsname {\symbol{"F1BA}} \def\faTaxi {{\FA\csname faicon@taxi\endcsname}} +\expandafter\def\csname faicon@television\endcsname {\symbol{"F26C}} \def\faTelevision {{\FA\csname faicon@television\endcsname}} +\expandafter\def\csname faicon@tencent-weibo\endcsname {\symbol{"F1D5}} \def\faTencentWeibo {{\FA\csname faicon@tencent-weibo\endcsname}} +\expandafter\def\csname faicon@terminal\endcsname {\symbol{"F120}} \def\faTerminal {{\FA\csname faicon@terminal\endcsname}} +\expandafter\def\csname faicon@text-height\endcsname {\symbol{"F034}} \def\faTextHeight {{\FA\csname faicon@text-height\endcsname}} +\expandafter\def\csname faicon@text-width\endcsname {\symbol{"F035}} \def\faTextWidth {{\FA\csname faicon@text-width\endcsname}} +\expandafter\def\csname faicon@th\endcsname {\symbol{"F00A}} \def\faTh {{\FA\csname faicon@th\endcsname}} +\expandafter\def\csname faicon@th-large\endcsname {\symbol{"F009}} \def\faThLarge {{\FA\csname faicon@th-large\endcsname}} +\expandafter\def\csname faicon@th-list\endcsname {\symbol{"F00B}} \def\faThList {{\FA\csname faicon@th-list\endcsname}} +\expandafter\def\csname faicon@thumb-tack\endcsname {\symbol{"F08D}} \def\faThumbTack {{\FA\csname faicon@thumb-tack\endcsname}} +\expandafter\def\csname faicon@thumbs-down\endcsname {\symbol{"F165}} \def\faThumbsDown {{\FA\csname faicon@thumbs-down\endcsname}} +\expandafter\def\csname faicon@thumbs-o-down\endcsname {\symbol{"F088}} \def\faThumbsODown {{\FA\csname faicon@thumbs-o-down\endcsname}} +\expandafter\def\csname faicon@thumbs-o-up\endcsname {\symbol{"F087}} \def\faThumbsOUp {{\FA\csname faicon@thumbs-o-up\endcsname}} +\expandafter\def\csname faicon@thumbs-up\endcsname {\symbol{"F164}} \def\faThumbsUp {{\FA\csname faicon@thumbs-up\endcsname}} +\expandafter\def\csname faicon@ticket\endcsname {\symbol{"F145}} \def\faTicket {{\FA\csname faicon@ticket\endcsname}} +\expandafter\def\csname faicon@times\endcsname {\symbol{"F00D}} \def\faTimes {{\FA\csname faicon@times\endcsname}} +\expandafter\def\csname faicon@times-circle\endcsname {\symbol{"F057}} \def\faTimesCircle {{\FA\csname faicon@times-circle\endcsname}} +\expandafter\def\csname faicon@times-circle-o\endcsname {\symbol{"F05C}} \def\faTimesCircleO {{\FA\csname faicon@times-circle-o\endcsname}} +\expandafter\def\csname faicon@tint\endcsname {\symbol{"F043}} \def\faTint {{\FA\csname faicon@tint\endcsname}} +\expandafter\def\csname faicon@toggle-down\endcsname {\symbol{"F150}} \def\faToggleDown {{\FA\csname faicon@toggle-down\endcsname}} +\expandafter\def\csname faicon@toggle-left\endcsname {\symbol{"F191}} \def\faToggleLeft {{\FA\csname faicon@toggle-left\endcsname}} +\expandafter\def\csname faicon@toggle-off\endcsname {\symbol{"F204}} \def\faToggleOff {{\FA\csname faicon@toggle-off\endcsname}} +\expandafter\def\csname faicon@toggle-on\endcsname {\symbol{"F205}} \def\faToggleOn {{\FA\csname faicon@toggle-on\endcsname}} +\expandafter\def\csname faicon@toggle-right\endcsname {\symbol{"F152}} \def\faToggleRight {{\FA\csname faicon@toggle-right\endcsname}} +\expandafter\def\csname faicon@toggle-up\endcsname {\symbol{"F151}} \def\faToggleUp {{\FA\csname faicon@toggle-up\endcsname}} +\expandafter\def\csname faicon@trademark\endcsname {\symbol{"F25C}} \def\faTrademark {{\FA\csname faicon@trademark\endcsname}} +\expandafter\def\csname faicon@train\endcsname {\symbol{"F238}} \def\faTrain {{\FA\csname faicon@train\endcsname}} +\expandafter\def\csname faicon@transgender\endcsname {\symbol{"F224}} \def\faTransgender {{\FA\csname faicon@transgender\endcsname}} +\expandafter\def\csname faicon@transgender-alt\endcsname {\symbol{"F225}} \def\faTransgenderAlt {{\FA\csname faicon@transgender-alt\endcsname}} +\expandafter\def\csname faicon@trash\endcsname {\symbol{"F1F8}} \def\faTrash {{\FA\csname faicon@trash\endcsname}} +\expandafter\def\csname faicon@trash-o\endcsname {\symbol{"F014}} \def\faTrashO {{\FA\csname faicon@trash-o\endcsname}} +\expandafter\def\csname faicon@tree\endcsname {\symbol{"F1BB}} \def\faTree {{\FA\csname faicon@tree\endcsname}} +\expandafter\def\csname faicon@trello\endcsname {\symbol{"F181}} \def\faTrello {{\FA\csname faicon@trello\endcsname}} +\expandafter\def\csname faicon@tripadvisor\endcsname {\symbol{"F262}} \def\faTripadvisor {{\FA\csname faicon@tripadvisor\endcsname}} +\expandafter\def\csname faicon@trophy\endcsname {\symbol{"F091}} \def\faTrophy {{\FA\csname faicon@trophy\endcsname}} +\expandafter\def\csname faicon@truck\endcsname {\symbol{"F0D1}} \def\faTruck {{\FA\csname faicon@truck\endcsname}} +\expandafter\def\csname faicon@try\endcsname {\symbol{"F195}} \def\faTry {{\FA\csname faicon@try\endcsname}} +\expandafter\def\csname faicon@tty\endcsname {\symbol{"F1E4}} \def\faTty {{\FA\csname faicon@tty\endcsname}} +\expandafter\def\csname faicon@tumblr\endcsname {\symbol{"F173}} \def\faTumblr {{\FA\csname faicon@tumblr\endcsname}} +\expandafter\def\csname faicon@tumblr-square\endcsname {\symbol{"F174}} \def\faTumblrSquare {{\FA\csname faicon@tumblr-square\endcsname}} +\expandafter\def\csname faicon@turkish-lira\endcsname {\symbol{"F195}} \def\faTurkishLira {{\FA\csname faicon@turkish-lira\endcsname}} +\expandafter\def\csname faicon@tv\endcsname {\symbol{"F26C}} \def\faTv {{\FA\csname faicon@tv\endcsname}} +\expandafter\def\csname faicon@twitch\endcsname {\symbol{"F1E8}} \def\faTwitch {{\FA\csname faicon@twitch\endcsname}} +\expandafter\def\csname faicon@twitter\endcsname {\symbol{"F099}} \def\faTwitter {{\FA\csname faicon@twitter\endcsname}} +\expandafter\def\csname faicon@twitter-square\endcsname {\symbol{"F081}} \def\faTwitterSquare {{\FA\csname faicon@twitter-square\endcsname}} +\expandafter\def\csname faicon@umbrella\endcsname {\symbol{"F0E9}} \def\faUmbrella {{\FA\csname faicon@umbrella\endcsname}} +\expandafter\def\csname faicon@underline\endcsname {\symbol{"F0CD}} \def\faUnderline {{\FA\csname faicon@underline\endcsname}} +\expandafter\def\csname faicon@undo\endcsname {\symbol{"F0E2}} \def\faUndo {{\FA\csname faicon@undo\endcsname}} +\expandafter\def\csname faicon@university\endcsname {\symbol{"F19C}} \def\faUniversity {{\FA\csname faicon@university\endcsname}} +\expandafter\def\csname faicon@unlink\endcsname {\symbol{"F127}} \def\faUnlink {{\FA\csname faicon@unlink\endcsname}} +\expandafter\def\csname faicon@unlock\endcsname {\symbol{"F09C}} \def\faUnlock {{\FA\csname faicon@unlock\endcsname}} +\expandafter\def\csname faicon@unlock-alt\endcsname {\symbol{"F13E}} \def\faUnlockAlt {{\FA\csname faicon@unlock-alt\endcsname}} +\expandafter\def\csname faicon@unsorted\endcsname {\symbol{"F0DC}} \def\faUnsorted {{\FA\csname faicon@unsorted\endcsname}} +\expandafter\def\csname faicon@upload\endcsname {\symbol{"F093}} \def\faUpload {{\FA\csname faicon@upload\endcsname}} +\expandafter\def\csname faicon@usd\endcsname {\symbol{"F155}} \def\faUsd {{\FA\csname faicon@usd\endcsname}} +\expandafter\def\csname faicon@user\endcsname {\symbol{"F007}} \def\faUser {{\FA\csname faicon@user\endcsname}} +\expandafter\def\csname faicon@user-md\endcsname {\symbol{"F0F0}} \def\faUserMd {{\FA\csname faicon@user-md\endcsname}} +\expandafter\def\csname faicon@user-plus\endcsname {\symbol{"F234}} \def\faUserPlus {{\FA\csname faicon@user-plus\endcsname}} +\expandafter\def\csname faicon@user-secret\endcsname {\symbol{"F21B}} \def\faUserSecret {{\FA\csname faicon@user-secret\endcsname}} +\expandafter\def\csname faicon@user-times\endcsname {\symbol{"F235}} \def\faUserTimes {{\FA\csname faicon@user-times\endcsname}} +\expandafter\def\csname faicon@users\endcsname {\symbol{"F0C0}} \def\faUsers {{\FA\csname faicon@users\endcsname}} +\expandafter\def\csname faicon@venus\endcsname {\symbol{"F221}} \def\faVenus {{\FA\csname faicon@venus\endcsname}} +\expandafter\def\csname faicon@venus-double\endcsname {\symbol{"F226}} \def\faVenusDouble {{\FA\csname faicon@venus-double\endcsname}} +\expandafter\def\csname faicon@venus-mars\endcsname {\symbol{"F228}} \def\faVenusMars {{\FA\csname faicon@venus-mars\endcsname}} +\expandafter\def\csname faicon@viacoin\endcsname {\symbol{"F237}} \def\faViacoin {{\FA\csname faicon@viacoin\endcsname}} +\expandafter\def\csname faicon@video-camera\endcsname {\symbol{"F03D}} \def\faVideoCamera {{\FA\csname faicon@video-camera\endcsname}} +\expandafter\def\csname faicon@vimeo\endcsname {\symbol{"F27D}} \def\faVimeo {{\FA\csname faicon@vimeo\endcsname}} +\expandafter\def\csname faicon@vimeo-square\endcsname {\symbol{"F194}} \def\faVimeoSquare {{\FA\csname faicon@vimeo-square\endcsname}} +\expandafter\def\csname faicon@vine\endcsname {\symbol{"F1CA}} \def\faVine {{\FA\csname faicon@vine\endcsname}} +\expandafter\def\csname faicon@vk\endcsname {\symbol{"F189}} \def\faVk {{\FA\csname faicon@vk\endcsname}} +\expandafter\def\csname faicon@volume-down\endcsname {\symbol{"F027}} \def\faVolumeDown {{\FA\csname faicon@volume-down\endcsname}} +\expandafter\def\csname faicon@volume-off\endcsname {\symbol{"F026}} \def\faVolumeOff {{\FA\csname faicon@volume-off\endcsname}} +\expandafter\def\csname faicon@volume-up\endcsname {\symbol{"F028}} \def\faVolumeUp {{\FA\csname faicon@volume-up\endcsname}} +\expandafter\def\csname faicon@warning\endcsname {\symbol{"F071}} \def\faWarning {{\FA\csname faicon@warning\endcsname}} +\expandafter\def\csname faicon@wechat\endcsname {\symbol{"F1D7}} \def\faWechat {{\FA\csname faicon@wechat\endcsname}} +\expandafter\def\csname faicon@weibo\endcsname {\symbol{"F18A}} \def\faWeibo {{\FA\csname faicon@weibo\endcsname}} +\expandafter\def\csname faicon@weixin\endcsname {\symbol{"F1D7}} \def\faWeixin {{\FA\csname faicon@weixin\endcsname}} +\expandafter\def\csname faicon@whatsapp\endcsname {\symbol{"F232}} \def\faWhatsapp {{\FA\csname faicon@whatsapp\endcsname}} +\expandafter\def\csname faicon@wheelchair\endcsname {\symbol{"F193}} \def\faWheelchair {{\FA\csname faicon@wheelchair\endcsname}} +\expandafter\def\csname faicon@wifi\endcsname {\symbol{"F1EB}} \def\faWifi {{\FA\csname faicon@wifi\endcsname}} +\expandafter\def\csname faicon@wikipedia-w\endcsname {\symbol{"F266}} \def\faWikipediaW {{\FA\csname faicon@wikipedia-w\endcsname}} +\expandafter\def\csname faicon@windows\endcsname {\symbol{"F17A}} \def\faWindows {{\FA\csname faicon@windows\endcsname}} +\expandafter\def\csname faicon@won\endcsname {\symbol{"F159}} \def\faWon {{\FA\csname faicon@won\endcsname}} +\expandafter\def\csname faicon@wordpress\endcsname {\symbol{"F19A}} \def\faWordpress {{\FA\csname faicon@wordpress\endcsname}} +\expandafter\def\csname faicon@wrench\endcsname {\symbol{"F0AD}} \def\faWrench {{\FA\csname faicon@wrench\endcsname}} +\expandafter\def\csname faicon@xing\endcsname {\symbol{"F168}} \def\faXing {{\FA\csname faicon@xing\endcsname}} +\expandafter\def\csname faicon@xing-square\endcsname {\symbol{"F169}} \def\faXingSquare {{\FA\csname faicon@xing-square\endcsname}} +\expandafter\def\csname faicon@y-combinator\endcsname {\symbol{"F23B}} \def\faYCombinator {{\FA\csname faicon@y-combinator\endcsname}} +\expandafter\def\csname faicon@y-combinator-square\endcsname {\symbol{"F1D4}} \def\faYCombinatorSquare {{\FA\csname faicon@y-combinator-square\endcsname}} +\expandafter\def\csname faicon@yahoo\endcsname {\symbol{"F19E}} \def\faYahoo {{\FA\csname faicon@yahoo\endcsname}} +\expandafter\def\csname faicon@yc\endcsname {\symbol{"F23B}} \def\faYc {{\FA\csname faicon@yc\endcsname}} +\expandafter\def\csname faicon@yc-square\endcsname {\symbol{"F1D4}} \def\faYcSquare {{\FA\csname faicon@yc-square\endcsname}} +\expandafter\def\csname faicon@yelp\endcsname {\symbol{"F1E9}} \def\faYelp {{\FA\csname faicon@yelp\endcsname}} +\expandafter\def\csname faicon@yen\endcsname {\symbol{"F157}} \def\faYen {{\FA\csname faicon@yen\endcsname}} +\expandafter\def\csname faicon@youtube\endcsname {\symbol{"F167}} \def\faYoutube {{\FA\csname faicon@youtube\endcsname}} +\expandafter\def\csname faicon@youtube-play\endcsname {\symbol{"F16A}} \def\faYoutubePlay {{\FA\csname faicon@youtube-play\endcsname}} +\expandafter\def\csname faicon@youtube-square\endcsname {\symbol{"F166}} \def\faYoutubeSquare {{\FA\csname faicon@youtube-square\endcsname}} +\endinput \ No newline at end of file diff --git a/public/lib/templates/template2/inputs/fonts/FontAwesome.otf b/public/lib/templates/template2/inputs/fonts/FontAwesome.otf new file mode 100644 index 00000000..681bdd4d Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/FontAwesome.otf differ diff --git a/public/lib/templates/template2/inputs/fonts/Roboto-Bold.ttf b/public/lib/templates/template2/inputs/fonts/Roboto-Bold.ttf new file mode 100644 index 00000000..91ec2122 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/Roboto-Bold.ttf differ diff --git a/public/lib/templates/template2/inputs/fonts/Roboto-BoldItalic.ttf b/public/lib/templates/template2/inputs/fonts/Roboto-BoldItalic.ttf new file mode 100644 index 00000000..4013bf88 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/Roboto-BoldItalic.ttf differ diff --git a/public/lib/templates/template2/inputs/fonts/Roboto-Italic.ttf b/public/lib/templates/template2/inputs/fonts/Roboto-Italic.ttf new file mode 100644 index 00000000..9f49ffd8 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/Roboto-Italic.ttf differ diff --git a/public/lib/templates/template2/inputs/fonts/Roboto-Light.ttf b/public/lib/templates/template2/inputs/fonts/Roboto-Light.ttf new file mode 100644 index 00000000..d43e9433 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/Roboto-Light.ttf differ diff --git a/public/lib/templates/template2/inputs/fonts/Roboto-LightItalic.ttf b/public/lib/templates/template2/inputs/fonts/Roboto-LightItalic.ttf new file mode 100644 index 00000000..c11442ce Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/Roboto-LightItalic.ttf differ diff --git a/public/lib/templates/template2/inputs/fonts/Roboto-Medium.ttf b/public/lib/templates/template2/inputs/fonts/Roboto-Medium.ttf new file mode 100644 index 00000000..87983419 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/Roboto-Medium.ttf differ diff --git a/public/lib/templates/template2/inputs/fonts/Roboto-MediumItalic.ttf b/public/lib/templates/template2/inputs/fonts/Roboto-MediumItalic.ttf new file mode 100644 index 00000000..5e866375 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/Roboto-MediumItalic.ttf differ diff --git a/public/lib/templates/template2/inputs/fonts/Roboto-Regular.ttf b/public/lib/templates/template2/inputs/fonts/Roboto-Regular.ttf new file mode 100644 index 00000000..7d9a6c4c Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/Roboto-Regular.ttf differ diff --git a/public/lib/templates/template2/inputs/fonts/Roboto-Thin.ttf b/public/lib/templates/template2/inputs/fonts/Roboto-Thin.ttf new file mode 100644 index 00000000..861d63ad Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/Roboto-Thin.ttf differ diff --git a/public/lib/templates/template2/inputs/fonts/Roboto-ThinItalic.ttf b/public/lib/templates/template2/inputs/fonts/Roboto-ThinItalic.ttf new file mode 100644 index 00000000..e65145f3 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/Roboto-ThinItalic.ttf differ diff --git a/public/lib/templates/template2/inputs/fonts/SourceSansPro-Bold.otf b/public/lib/templates/template2/inputs/fonts/SourceSansPro-Bold.otf new file mode 100644 index 00000000..98dbee74 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/SourceSansPro-Bold.otf differ diff --git a/public/lib/templates/template2/inputs/fonts/SourceSansPro-BoldIt.otf b/public/lib/templates/template2/inputs/fonts/SourceSansPro-BoldIt.otf new file mode 100644 index 00000000..6600c863 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/SourceSansPro-BoldIt.otf differ diff --git a/public/lib/templates/template2/inputs/fonts/SourceSansPro-It.otf b/public/lib/templates/template2/inputs/fonts/SourceSansPro-It.otf new file mode 100644 index 00000000..2d627d9c Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/SourceSansPro-It.otf differ diff --git a/public/lib/templates/template2/inputs/fonts/SourceSansPro-Light.otf b/public/lib/templates/template2/inputs/fonts/SourceSansPro-Light.otf new file mode 100644 index 00000000..159979f6 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/SourceSansPro-Light.otf differ diff --git a/public/lib/templates/template2/inputs/fonts/SourceSansPro-LightIt.otf b/public/lib/templates/template2/inputs/fonts/SourceSansPro-LightIt.otf new file mode 100644 index 00000000..e3d49b5f Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/SourceSansPro-LightIt.otf differ diff --git a/public/lib/templates/template2/inputs/fonts/SourceSansPro-Regular.otf b/public/lib/templates/template2/inputs/fonts/SourceSansPro-Regular.otf new file mode 100644 index 00000000..bdcfb27a Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/SourceSansPro-Regular.otf differ diff --git a/public/lib/templates/template2/inputs/fonts/SourceSansPro-Semibold.otf b/public/lib/templates/template2/inputs/fonts/SourceSansPro-Semibold.otf new file mode 100644 index 00000000..fffdbafe Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/SourceSansPro-Semibold.otf differ diff --git a/public/lib/templates/template2/inputs/fonts/SourceSansPro-SemiboldIt.otf b/public/lib/templates/template2/inputs/fonts/SourceSansPro-SemiboldIt.otf new file mode 100644 index 00000000..e90515b3 Binary files /dev/null and b/public/lib/templates/template2/inputs/fonts/SourceSansPro-SemiboldIt.otf differ diff --git a/public/lib/templates/template3/index.ts b/public/lib/templates/template3/index.ts new file mode 100644 index 00000000..f4be4140 --- /dev/null +++ b/public/lib/templates/template3/index.ts @@ -0,0 +1,343 @@ +import { stripIndent, source } from 'common-tags' +import { WHITESPACE } from '../constants' +import type { FormValues, Generator } from '../../../types' + +const generator: Generator = { + profileSection(basics) { + if (!basics) { + return '' + } + + const { name, email, phone, location = {}, website } = basics + const info = [email, phone, location.address, website] + .filter(Boolean) + .join(' | ') + + return stripIndent` + \\begin{tabular*}{7in}{l@{\\extracolsep{\\fill}}r} + \\textbf{\\Large ${name}} & \\textit{${info}} + \\end{tabular*} + ` + }, + + educationSection(education, heading) { + if (!education) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\resheading{${heading || 'Education'}} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\begin{itemize}[leftmargin=*] + + ${education.map((school) => { + const { + institution = '', + location = '', + studyType = '', + area = '', + score = '', + startDate = '', + endDate = '' + } = school + + let formattedLocation = '' + + if (location) { + formattedLocation = location + '\\\\' + } + + let degreeLine = '' + + if (studyType && area) { + degreeLine = `${studyType} ${area}` + } else if (studyType || area) { + degreeLine = studyType || area + } + + if (score) { + degreeLine += degreeLine ? `, GPA: ${score}` : `GPA: ${score}` + } + + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } + + return stripIndent` + \\item[] + \\school + {${institution || ''}} + {${formattedLocation || ''}} + {${degreeLine}} + {${dateRange || ''}} + ` + })} + + \\end{itemize} + ` + }, + + workSection(work, heading) { + if (!work) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\resheading{${heading || 'Experience'}} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\begin{itemize}[leftmargin=*] + ${work.map((job) => { + const { company, position, location, startDate, endDate, highlights } = job + + let dateRange + let dutyLines + + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } + + if (highlights) { + dutyLines = source` + \\begin{itemize} + ${highlights.map((duty) => `\\item ${duty}`)} + \\end{itemize} + ` + } + + return stripIndent` + \\item[] + \\job + {${company || ''}} + {${location || ''}} + {${position || ''}} + {${dateRange || ''}} + ${dutyLines} + ` + })} + \\end{itemize} + ` + }, + + skillsSection(skills, heading) { + if (!skills) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\resheading{${heading || 'Skills'}} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\begin{itemize}[leftmargin=*] + \\setlength\\itemsep{0em} + ${skills.map((skill) => { + const { name = '', keywords = [] } = skill + return `\\item[] \\skill{${name}}{${keywords.join(', ')}}` + })} + \\end{itemize} + ` + }, + + projectsSection(projects, heading) { + if (!projects) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\resheading{${heading || 'Projects'}} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\begin{itemize}[leftmargin=*] + ${projects.map((project) => { + const { name = '', highlights = [], keywords = [], url = '' } = project + + let highlightsWithNewline = '' + if (highlights && highlights.length) { + highlightsWithNewline = stripIndent` + \\begin{itemize} + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + } + + return stripIndent` + \\item[] + \\project + {${name}} + {${keywords.join(', ')}} + {${url}} + {${highlightsWithNewline}} + ` + })} + \\end{itemize} + ` + }, + + awardsSection(awards, heading) { + if (!awards) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\resheading{${heading || 'Awards'}} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\begin{itemize}[leftmargin=*] + ${awards.map((award) => { + const { title = '', summary = '', date = '', awarder = '' } = award + + const summaryWithNewline = summary ? `\\\\${summary}` : summary + + return stripIndent` + \\item[] + \\award + {${title}} + {${date}} + {${awarder}} + {${summaryWithNewline}} + ` + })} + \\end{itemize} + ` + }, + + resumeHeader() { + return stripIndent` + % (c) 2002 Matthew Boedicker <mboedick@mboedick.org> (original author) http://mboedick.org + % (c) 2003-2007 David J. Grant <davidgrant-at-gmail.com> http://www.davidgrant.ca + % (c) 2008 Nathaniel Johnston <nathaniel@nathanieljohnston.com> http://www.nathanieljohnston.com + % + % (c) 2012 Scott Clark <sc932@cornell.edu> cam.cornell.edu/~sc932 + % + %This work is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 2.5 License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. + + \\documentclass[11pt]{article} + \\newlength{\\outerbordwidth} + \\pagestyle{empty} + \\raggedbottom + \\raggedright + \\usepackage[svgnames]{xcolor} + \\usepackage{framed} + \\usepackage{tocloft} + \\usepackage{enumitem} + \\usepackage{textcomp} + \\usepackage[utf8]{inputenc} + \\usepackage[T1]{fontenc} + + + %----------------------------------------------------------- + %Edit these values as you see fit + + \\setlength{\\outerbordwidth}{3pt} % Width of border outside of title bars + \\definecolor{shadecolor}{gray}{0.75} % Outer background color of title bars (0 = black, 1 = white) + \\definecolor{shadecolorB}{gray}{0.93} % Inner background color of title bars + + + %----------------------------------------------------------- + %Margin setup + + \\setlength{\\evensidemargin}{-0.25in} + \\setlength{\\headheight}{0in} + \\setlength{\\headsep}{0in} + \\setlength{\\oddsidemargin}{-0.25in} + \\setlength{\\tabcolsep}{0in} + \\setlength{\\textheight}{9.5in} + \\setlength{\\textwidth}{7in} + \\setlength{\\topmargin}{-0.3in} + \\setlength{\\topskip}{0in} + \\setlength{\\voffset}{0.1in} + + + %----------------------------------------------------------- + %Custom commands + \\newcommand{\\resitem}[1]{\\item #1 \\vspace{-4pt}} + \\newcommand{\\resheading}[1]{ + \\parbox{\\textwidth}{\\setlength{\\FrameSep}{\\outerbordwidth} + \\begin{shaded} + \\setlength{\\fboxsep}{0pt}\\framebox[\\textwidth][l]{\\setlength{\\fboxsep}{4pt}\\fcolorbox{shadecolorB}{shadecolorB}{\\textbf{\\sffamily{\\mbox{~}\\makebox[6.762in][l]{\\large #1} \\vphantom{p\\^{E}}}}}} + \\end{shaded} + }\\vspace{-11pt} + } + \\newcommand{\\ressubheading}[4]{ + \\begin{tabular*}{6.5in}{l@{\\cftdotfill{\\cftsecdotsep}\\extracolsep{\\fill}}r} + \\textbf{#1} & #2 \\\\ + \\textit{#3} & \\textit{#4} \\\\ + + \\end{tabular*}\\vspace{-6pt}} + + \\newcommand{\\school}[4]{\\vspace{1.5mm} + \\textbf{#1} \\hfill #2 \\textit{#3} \\hfill \\textit{#4} \\vspace{1.5mm} + } + + \\newcommand{\\job}[4]{ + \\textbf{#1} \\hfill #2 \\hfill \\textit{#3} \\hfill \\textit{#4} + } + + \\newcommand{\\skill}[2]{ + \\textbf{#1} #2 + } + + \\newcommand{\\project}[4]{ \\vspace{1.5mm} + \\textbf{#1} #2 \\hfill \\textit{#3}#4 \\vspace{1.5mm} + } + + \\newcommand{\\award}[4]{ \\vspace{1.5mm} + \\textbf{#1} #2 \\hfill \\textit{#3} #4 \\vspace{1.5mm} + } + %----------------------------------------------------------- + ` + } +} + +function template3(values: FormValues) { + const { headings = {} } = values + + return stripIndent` + ${generator.resumeHeader()} + \\begin{document} + ${values.sections + .map((section) => { + switch (section) { + case 'profile': + return generator.profileSection(values.basics) + + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection(values.projects, headings.projects) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n')} + ${WHITESPACE} + \\end{document} + ` +} + +export default template3 diff --git a/public/lib/templates/template4/index.ts b/public/lib/templates/template4/index.ts new file mode 100644 index 00000000..183219cb --- /dev/null +++ b/public/lib/templates/template4/index.ts @@ -0,0 +1,397 @@ +import { stripIndent, source } from 'common-tags' +import { WHITESPACE } from '../constants' +import type { FormValues, Generator } from '../../../types' + +const generator: Generator = { + profileSection(profile) { + if (!profile) { + return '\\namesection{Your}{Name}{}' + } + + const { name, email, phone, location = {}, website } = profile + + let nameStart = '' + let nameEnd = '' + + if (name) { + const names = name.split(' ') + + if (names.length === 1) { + nameStart = names[0] + nameEnd = '' + } else { + nameStart = names[0] + nameEnd = names.slice(1, names.length).join(' ') + } + } + + const info = [email, phone, location.address, website] + .filter(Boolean) + .join(' | ') + + const sectionHeader = stripIndent` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Profile + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ` + + if (!name) { + return stripIndent` + ${sectionHeader} + \\centering{ + \\color{headings} + \\fontspec[Path = fonts/raleway/]{Raleway-Medium} + \\fontsize{11pt}{14pt} + \\selectfont ${info} + } + ` + } + + return stripIndent` + ${sectionHeader} + \\namesection{${nameStart}}{${nameEnd}}{${info}} + ` + }, + + educationSection(education, heading) { + if (!education) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Education + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\section{${heading || 'Education'}} + \\raggedright + ${education.map((school) => { + const { + institution, + location, + studyType, + area, + score, + startDate, + endDate + } = school + + let line1 = '' + let line2 = '' + + if (institution) { + line1 += `\\runsubsection{${institution}}` + } + + if (studyType && area) { + line1 += `\\descript{| ${studyType} ${area}}` + } else if (studyType) { + line1 += `\\descript{| ${studyType}}` + } else if (area) { + line1 += `\\descript{| ${area}}` + } + + let dateRange + + if (startDate && endDate) { + dateRange = `${startDate} - ${endDate}` + } else if (startDate) { + dateRange = `${startDate} - Present` + } else { + dateRange = endDate + } + + const locationAndDate = [location, dateRange] + .filter(Boolean) + .join(' | ') + + if (locationAndDate) { + line1 += `\\hfill \\location{${locationAndDate}}` + } + + if (line1) { + line1 += '\\\\' + } + + if (score) { + line2 += `GPA: ${score}\\\\` + } + + return ` + ${line1} + ${line2} + \\sectionsep + ` + })} + ` + }, + + workSection(work, heading) { + if (!work) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Experience + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\section{${heading || 'Experience'}} + ${work.map((job) => { + const { + company, + position, + location, + startDate, + endDate = '', + highlights + } = job + + let line1 = '' + let dateRange = '' + let highlightLines = '' + + if (company) { + line1 += `\\runsubsection{${company}}` + } + + if (position) { + line1 += `\\descript{| ${position}}` + } + + if (startDate && endDate) { + dateRange = `${startDate} – ${endDate}` + } else if (startDate) { + dateRange = `${startDate} – Present` + } else { + dateRange = endDate + } + + if (location && dateRange) { + line1 += `\\hfill \\location{${location} | ${dateRange}}` + } else if (location) { + line1 += `\\hfill \\location{${location}}` + } else if (dateRange) { + line1 += `\\hfill \\location{${dateRange}}` + } + + if (highlights) { + highlightLines = source` + \\begin{tightemize} + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{tightemize} + ` + } + + return stripIndent` + ${line1} + ${highlightLines} + \\sectionsep + ` + })} + ` + }, + + skillsSection(skills, heading) { + if (!skills) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Skills + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\section{${heading || 'Skills'}} + \\raggedright + \\begin{tabular}{ l l } + ${skills.map((skill) => { + const { name = '', keywords = [] } = skill + return `\\descript{${name}} & {\\location{${keywords.join(', ')}}} \\\\` + })} + \\end{tabular} + \\sectionsep + ` + }, + + projectsSection(projects, heading) { + if (!projects) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Projects + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\section{${heading || 'Projects'}} + \\raggedright + ${projects.map((project) => { + const { name, highlights, keywords, url } = project + + let line1 = '' + let line2 = '' + let highlightLines = '' + + if (name) { + line1 += `\\runsubsection{\\large{${name}}}` + } + + if (keywords) { + line2 += `\\descript{| ${keywords.join(', ')}}` + } + + if (url) { + line2 += `\\hfill \\location{${url}}` + } + + if (line2) { + line2 += '\\\\' + } + + if (highlights) { + highlightLines = source` + \\begin{tightemize} + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{tightemize} + ` + } + + return ` + ${line1} + ${line2} + ${highlightLines} + \\sectionsep + ` + })} + ` + }, + + awardsSection(awards, heading) { + if (!awards) { + return '' + } + + return source` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Awards + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\section{${heading || 'Awards'}} + ${awards.map((award) => { + const { title, summary, date, awarder } = award + const info = [awarder, date].filter(Boolean).join(' | ') + + return stripIndent` + \\runsubsection{\\large{${title || ''}}} \\descript{${info}} \\\\ + ${summary ? `${summary}\\\\` : ''} + \\sectionsep + ` + })} + ` + }, + + resumeHeader() { + return stripIndent` + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % This is a modified ONE COLUMN version of + % the following template: + % + % Deedy - One Page Two Column Resume + % LaTeX Template + % Version 1.1 (30/4/2014) + % + % Original author: + % Debarghya Das (http://debarghyadas.com) + % + % Original repository: + % https://github.com/deedydas/Deedy-Resume + % + % IMPORTANT: THIS TEMPLATE NEEDS TO BE COMPILED WITH XeLaTeX + % + % This template uses several fonts not included with Windows/Linux by + % default. If you get compilation errors saying a font is missing, find the line + % on which the font is used and either change it to a font included with your + % operating system or comment the line out to use the default font. + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % TODO: + % 1. Integrate biber/bibtex for article citation under publications. + % 2. Figure out a smoother way for the document to flow onto the next page. + % 3. Add styling information for a "Projects/Hacks" section. + % 4. Add location/address information + % 5. Merge OpenFont and MacFonts as a single sty with options. + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % CHANGELOG: + % v1.1: + % 1. Fixed several compilation bugs with \\renewcommand + % 2. Got Open-source fonts (Windows/Linux support) + % 3. Added Last Updated + % 4. Move Title styling into .sty + % 5. Commented .sty file. + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Known Issues: + % 1. Overflows onto second page if any column's contents are more than the + % vertical limit + % 2. Hacky space on the first bullet point on the second column. + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ` + } +} + +function template4(values: FormValues) { + const { headings = {} } = values + + return stripIndent` + ${generator.resumeHeader()} + \\documentclass[]{deedy-resume-openfont} + + \\begin{document} + ${values.sections + .map((section) => { + switch (section) { + case 'profile': + return generator.profileSection(values.basics) + + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection(values.projects, headings.projects) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n')} + ${WHITESPACE} + \\end{document} + ` +} + +export default template4 diff --git a/public/lib/templates/template4/inputs/deedy-resume-openfont.cls b/public/lib/templates/template4/inputs/deedy-resume-openfont.cls new file mode 100644 index 00000000..ebb55681 --- /dev/null +++ b/public/lib/templates/template4/inputs/deedy-resume-openfont.cls @@ -0,0 +1,80 @@ +% Intro Options +\ProvidesClass{deedy-resume-openfont}[2014/04/30 CV class] +\NeedsTeXFormat{LaTeX2e} +\DeclareOption{print}{\def\@cv@print{}} +\DeclareOption*{% + \PassOptionsToClass{\CurrentOption}{article} +} +\ProcessOptions\relax +\LoadClass{article} + +% Package Imports +\usepackage[hmargin=1.25cm, vmargin=0.7cm]{geometry} +\usepackage[usenames,dvipsnames]{xcolor} +\usepackage[hidelinks]{hyperref} +\usepackage{titlesec} +\usepackage[absolute]{textpos} +\usepackage[UKenglish]{babel} +\usepackage[UKenglish]{isodate} +\usepackage{fontspec,xltxtra,xunicode,fontenc} +\usepackage{textcomp} + +% Color definitions +\definecolor{date}{HTML}{666666} +\definecolor{primary}{HTML}{2b2b2b} +\definecolor{headings}{HTML}{6A6A6A} +\definecolor{subheadings}{HTML}{333333} + +% Set main fonts +\defaultfontfeatures{Mapping=tex-text} +\setmainfont[Color=primary, Path = fonts/raleway/]{Raleway-ExtraLight} +\setsansfont[Scale=MatchLowercase,Mapping=tex-text, Path = fonts/raleway/]{Raleway-ExtraLight} +\newcommand{\custombold}[1]{\color{subheadings}\fontspec[Path = fonts/raleway/]{Raleway-Regular}\selectfont #1 \normalfont} + +% Date command +\setlength{\TPHorizModule}{1mm} +\setlength{\TPVertModule}{1mm} +\textblockorigin{0mm}{5mm} % start everyth +\newcommand{\lastupdated}{\begin{textblock}{60}(165,0) +\color{date}\fontspec[Path = fonts/raleway/]{Raleway-ExtraLight}\fontsize{8pt}{10pt}\selectfont +Last Updated on +\today +\end{textblock}} + +% Name command +\newcommand{\namesection}[3]{ + \centering{ + \sffamily + \fontspec[Path = fonts/raleway/]{Raleway-ExtraLight}\fontsize{40pt}{10cm}\selectfont #1 + \fontspec[Path = fonts/raleway/]{Raleway-ExtraLight}\selectfont #2 + } \\ + \vspace{5pt} + \centering{ \color{headings}\fontspec[Path = fonts/raleway/]{Raleway-Medium}\fontsize{11pt}{14pt}\selectfont #3} + \noindent\makebox[\linewidth]{\rule{\paperwidth}{0.4pt}} + \vspace{-15pt} +} +\titlespacing{\section}{0pt}{0pt}{0pt} + +% Headings command +\titleformat{\section}{\color{headings} +\scshape\fontspec[Path = fonts/raleway/]{Raleway-Medium}\fontsize{16pt}{24pt}\selectfont \raggedright\uppercase}{} {0em}{} + +% Subeadings command +\titleformat{\subsection}{\color{subheadings} +\fontspec[Path = fonts/raleway/]{Raleway-Medium}\fontsize{12pt}{12pt}\selectfont\bfseries\uppercase}{}{0em}{} +\titlespacing{\subsection}{0pt}{\parskip}{-\parskip} +\titlespacing{\subsubsection}{0pt}{\parskip}{-\parskip} +\newcommand{\runsubsection}[1]{\color{subheadings} +\fontspec[Path = fonts/raleway/]{Raleway-Medium}\fontsize{12pt}{12pt}\selectfont\bfseries\uppercase {#1} \normalfont} + +% Descriptors command +\newcommand{\descript}[1]{\color{subheadings}\raggedright\scshape\fontspec[Path = fonts/raleway/]{Raleway-Medium}\fontsize{11pt}{13pt}\selectfont {#1} \normalfont} + +% Location command +\newcommand{\location}[1]{\color{headings}\raggedright\fontspec[Path = fonts/raleway/]{Raleway-Medium}\fontsize{11pt}{13pt}\selectfont {#1} \normalfont} + +% Section seperators command +\newcommand{\sectionsep}[0]{\vspace{8pt}} + +% Bullet Lists with fewer gaps command +\newenvironment{tightemize}{\vspace{-1mm}\begin{itemize}\itemsep1pt \parskip1.5pt \parsep1.5pt}{\end{itemize}\vspace{-\topsep}} diff --git a/public/lib/templates/template4/inputs/fonts/lato/Lato-Bla.ttf b/public/lib/templates/template4/inputs/fonts/lato/Lato-Bla.ttf new file mode 100644 index 00000000..6848db0d Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/lato/Lato-Bla.ttf differ diff --git a/public/lib/templates/template4/inputs/fonts/lato/Lato-BlaIta.ttf b/public/lib/templates/template4/inputs/fonts/lato/Lato-BlaIta.ttf new file mode 100644 index 00000000..5decf129 Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/lato/Lato-BlaIta.ttf differ diff --git a/public/lib/templates/template4/inputs/fonts/lato/Lato-Bol.ttf b/public/lib/templates/template4/inputs/fonts/lato/Lato-Bol.ttf new file mode 100644 index 00000000..74343694 Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/lato/Lato-Bol.ttf differ diff --git a/public/lib/templates/template4/inputs/fonts/lato/Lato-BolIta.ttf b/public/lib/templates/template4/inputs/fonts/lato/Lato-BolIta.ttf new file mode 100644 index 00000000..684aacf5 Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/lato/Lato-BolIta.ttf differ diff --git a/public/lib/templates/template4/inputs/fonts/lato/Lato-Hai.ttf b/public/lib/templates/template4/inputs/fonts/lato/Lato-Hai.ttf new file mode 100644 index 00000000..288be295 Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/lato/Lato-Hai.ttf differ diff --git a/public/lib/templates/template4/inputs/fonts/lato/Lato-HaiIta.ttf b/public/lib/templates/template4/inputs/fonts/lato/Lato-HaiIta.ttf new file mode 100644 index 00000000..c2bfd335 Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/lato/Lato-HaiIta.ttf differ diff --git a/public/lib/templates/template4/inputs/fonts/lato/Lato-Lig.ttf b/public/lib/templates/template4/inputs/fonts/lato/Lato-Lig.ttf new file mode 100644 index 00000000..a958067a Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/lato/Lato-Lig.ttf differ diff --git a/public/lib/templates/template4/inputs/fonts/lato/Lato-LigIta.ttf b/public/lib/templates/template4/inputs/fonts/lato/Lato-LigIta.ttf new file mode 100644 index 00000000..5e45ad9a Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/lato/Lato-LigIta.ttf differ diff --git a/public/lib/templates/template4/inputs/fonts/lato/Lato-Reg.ttf b/public/lib/templates/template4/inputs/fonts/lato/Lato-Reg.ttf new file mode 100644 index 00000000..04ea8efb Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/lato/Lato-Reg.ttf differ diff --git a/public/lib/templates/template4/inputs/fonts/lato/Lato-RegIta.ttf b/public/lib/templates/template4/inputs/fonts/lato/Lato-RegIta.ttf new file mode 100644 index 00000000..3d3b7a29 Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/lato/Lato-RegIta.ttf differ diff --git a/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Bold.otf b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Bold.otf new file mode 100644 index 00000000..2f840b75 Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Bold.otf differ diff --git a/public/lib/templates/template4/inputs/fonts/raleway/Raleway-ExtraBold.otf b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-ExtraBold.otf new file mode 100644 index 00000000..133552cd Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-ExtraBold.otf differ diff --git a/public/lib/templates/template4/inputs/fonts/raleway/Raleway-ExtraLight.otf b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-ExtraLight.otf new file mode 100644 index 00000000..4ab05bbd Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-ExtraLight.otf differ diff --git a/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Heavy.otf b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Heavy.otf new file mode 100644 index 00000000..63c952aa Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Heavy.otf differ diff --git a/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Light.otf b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Light.otf new file mode 100644 index 00000000..cb4ff4ed Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Light.otf differ diff --git a/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Medium.otf b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Medium.otf new file mode 100644 index 00000000..79786fe4 Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Medium.otf differ diff --git a/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Regular.otf b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Regular.otf new file mode 100644 index 00000000..871e0f44 Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Regular.otf differ diff --git a/public/lib/templates/template4/inputs/fonts/raleway/Raleway-SemiBold.otf b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-SemiBold.otf new file mode 100644 index 00000000..33d19f6b Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-SemiBold.otf differ diff --git a/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Thin.otf b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Thin.otf new file mode 100644 index 00000000..13a581d3 Binary files /dev/null and b/public/lib/templates/template4/inputs/fonts/raleway/Raleway-Thin.otf differ diff --git a/public/lib/templates/template5/index.ts b/public/lib/templates/template5/index.ts new file mode 100644 index 00000000..af06252d --- /dev/null +++ b/public/lib/templates/template5/index.ts @@ -0,0 +1,281 @@ +import { stripIndent, source } from 'common-tags' +import { WHITESPACE } from '../constants' +import type { FormValues, Generator } from '../../../types' + +const generator: Omit<Generator, 'resumeHeader'> = { + profileSection(basics) { + if (!basics) { + return '' + } + + const { name, email, phone, location = {}, website } = basics + const info = [email, phone, location.address, website] + .filter(Boolean) + .join(' | ') + + return stripIndent` + \\name{{\\LARGE ${name || ''}}} + \\address{${info}} + ` + }, + + educationSection(education, heading) { + if (!education) { + return '' + } + + const lastSchoolIndex = education.length - 1 + + return source` + \\section{${heading || 'EDUCATION'}} + ${education.map((school, i) => { + const { + institution, + location, + studyType = '', + area = '', + score, + startDate, + endDate = '' + } = school + + let schoolLine = '' + let degreeLine = '' + + if (institution) { + schoolLine += `\\textbf{${institution}}, ` + } + + if (studyType && area) { + degreeLine = `${studyType} in ${area}` + } else if (studyType || area) { + degreeLine = studyType || area + } + + if (degreeLine) { + schoolLine += `{\\sl ${degreeLine}} ` + } + + if (score) { + schoolLine += `GPA: ${score}` + } + + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } + + if (dateRange) { + schoolLine += `\\hfill ${dateRange}` + } + + if (schoolLine) { + schoolLine += '\\\\' + } + + if (location) { + schoolLine += `${location}` + } + + if (i !== lastSchoolIndex) { + schoolLine += '\\\\\\\\' + } + + return schoolLine + })} + ` + }, + + workSection(work, heading) { + if (!work) { + return '' + } + + return source` + \\section{${heading || 'EXPERIENCE'}} + ${work.map((job) => { + const { + company, + position, + location, + startDate, + endDate = '', + highlights + } = job + + let jobLine = '' + let dateRange = '' + + if (company) { + jobLine += `\\textbf{${company}}, ` + } + + if (position) { + jobLine += `{\\sl ${position}}` + } + + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } + + if (dateRange) { + jobLine += `\\hfill ${dateRange}` + } + + if (jobLine) { + jobLine += '\\\\' + } + + if (location) { + jobLine += `${location}\\\\` + } + + if (highlights) { + jobLine += source` + \\begin{itemize} \\itemsep 3pt + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + } + + return jobLine + })} + ` + }, + + skillsSection(skills, heading) { + if (!skills) { + return '' + } + + return source` + \\section{${heading || 'SKILLS'}} + \\begin{tabular}{@{}ll} + ${skills.map((skill) => { + const { name, keywords = [] } = skill + return `\\textbf{${name || ''}}: & ${keywords.join(', ') || ''}\\\\` + })} + \\end{tabular} + ` + }, + + projectsSection(projects, heading) { + if (!projects) { + return '' + } + + return source` + \\section{${heading || 'PROJECTS'}} + ${projects.map((project) => { + const { name, highlights, keywords = [], url } = project + + let projectLine = '' + + if (name) { + projectLine += `\\textbf{${name}}` + } + + if (keywords) { + projectLine += `, {\\sl ${keywords.join(', ')}}` + } + + if (highlights) { + projectLine += projectLine ? `\\\\` : '' + projectLine += source` + \\begin{itemize} \\itemsep 3pt + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + } + + if (url) { + projectLine += projectLine ? `\\\\ ${url}` : url + } + + if (projectLine) { + projectLine += '\\\\\\\\' + } + + return projectLine + })} + ` + }, + + awardsSection(awards, heading) { + if (!awards) { + return '' + } + + return source` + \\section{${heading || 'AWARDS'}} + ${awards.map((award) => { + const { title, summary, date, awarder } = award + + return stripIndent` + \\textbf{${title || ''}}, {\\sl ${awarder || ''}} \\hfill ${date || '' + } \\\\ + ${summary || ''} \\\\\\\\ + ` + })} + ` + } +} + +function template5(values: FormValues) { + const { headings = {} } = values + + return stripIndent` + \\documentclass[line,margin]{res} + \\usepackage[none]{hyphenat} + \\usepackage{textcomp} + \\usepackage[utf8]{inputenc} + \\usepackage[T1]{fontenc} + \\begin{document} + ${generator.profileSection(values.basics)} + \\begin{resume} + \\vspace{-5mm} + ${values.sections + .map((section) => { + switch (section) { + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection( + values.projects, + headings.projects + ) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n')} + ${WHITESPACE} + \\end{resume} + \\end{document} + ` +} + +export default template5 diff --git a/public/lib/templates/template5/inputs/helvetica.sty b/public/lib/templates/template5/inputs/helvetica.sty new file mode 100644 index 00000000..2b8d920e --- /dev/null +++ b/public/lib/templates/template5/inputs/helvetica.sty @@ -0,0 +1,32 @@ +%% +%% This is file `helvetica.sty', based on helvet.sty extended to include +%% definitions for rm and tt. This means commands such as \textbf, \textit, +%% etc. will appear in Helvetica. +%% Changes added by Harriet Borton on <1995/12/11> +%% +%% The original source files were: +%% +%% psfonts.dtx (with options: `helvet') +%% +%% Copyright (C) 1994 Sebastian Rahtz +%% All rights reserved. +%% +%% The original file is part of the PSNFSS2e package. +%% ----------------------------------------- +%% +%% This is a generated file. Permission is granted to to customize the +%% declarations in this file to serve the needs of your installation. +%% However, no permission is granted to distribute a modified version of +%% this file under its original name. +\def\fileversion{4.2} +\def\filedate{94/11/11} +\def\docdate {94/11/06} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{helvetica}[\filedate\space\fileversion\space +Helvetica PSNFSS2e package] +\renewcommand{\sfdefault}{phv} +\renewcommand{\rmdefault}{phv} +\renewcommand{\ttdefault}{pcr} +\endinput +%% +%% End of file `helvetica.sty'. diff --git a/public/lib/templates/template5/inputs/res.cls b/public/lib/templates/template5/inputs/res.cls new file mode 100644 index 00000000..2d2a3bb6 --- /dev/null +++ b/public/lib/templates/template5/inputs/res.cls @@ -0,0 +1,802 @@ +% RESUME DOCUMENT STYLE -- Released 23 Nov 1989 +% for LaTeX version 2.09 +% Copyright (C) 1988,1989 by Michael DeCorte + +\typeout{Document Style `res' <26 Sep 89>.} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% res.sty +% +% \documentstyle{res} +% +% Copyright (c) 1988 by Michael DeCorte +% Permission to copy all or part of this work is granted, provided +% that the copies are not made or distributed for resale, and that +% the copyright notice and this notice are retained. +% +% THIS WORK IS PROVIDED ON AN "AS IS" BASIS. THE AUTHOR PROVIDES NO +% WARRANTY WHATSOEVER, EITHER EXPRESS OR IMPLIED, REGARDING THE WORK, +% INCLUDING WARRANTIES WITH RESPECT TO ITS MERCHANTABILITY OR FITNESS +% FOR ANY PARTICULAR PURPOSE. +% +% If you make any improvements, I'd like to hear about them. +% +% Michael DeCorte +% P.O. Box 652 +% Potsdam NY 13676 +% mrd@sun.soe.clarkson.edu +% mrd@clutx.bitnet +% +% Changes for LaTeX2e -- Venkat Krishnamurthy (Aug 7, 2001) +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% You can have multiple style options the legal options ones are: +% +% centered the name and address are centered at the top of the +% page (default) +% +% line the name is the left with a horizontal line then +% the address to the right +% +% overlapped the section titles overlap the body text (default) +% +% margin the section titles are to the left of the body text +% +% 11pt use 11 point fonts instead of 10 point fonts +% +% 12pt use 12 point fonts instead of 10 point fonts +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Commands +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \Resume prints the word resume but typeset nicely +% +% \newsectionwidth{dimen} +% defines the amount of space the labels extend +% into the left margin. +% DO NOT TRY to change any of the dimensions +% yourself. You will probably confuse the style file. +% +% \name{text} defines your name +% +% \address{text} +% defines your address +% this can be called twice if you have two addresses +% use \\'s to indicate where either line breaks or +% comas should go +% +% \opening this prints your name and address at that spot +% this is not normally needed, as \begin{resume} +% does this but is provided just in case you need +% to do something odd +% +% \begin{resume} ... \end{resume} +% all of the resume should go inside of this +% environment +% +% \section{text} +% This prints 'text' in the left hand margin. +% Its exact placement depends on what the style +% options has been set to. (overlapped or margin) +% You should use \\ to start a new line. If the +% style option is margin, the \\ is converted +% to a space. +% To use this in any of the list environments, put +% the \section after the \item[] but before the +% text. +% Eg. +% \begin{itemize} +% \item\section{text} +% text +% \end{itemize} +% +% \begin{ncolumn}{n} ... \end{ncolumn} +% creates a tabular environment with n equally +% spaced columns. Separate columns by & and +% end them with \\ +% +% \begin{position} ... \end{position} +% this is used to print a job description. There should +% be only one job description in it. Information +% related to the job (such as title, dates...) will +% be printed. +% +% \begin{format} ... \end{format} +% used to change the default format for the position +% environment. Within it the recognized commands are: +% \title{option} +% \employer{option} +% \location{option} +% \dates{option} +% \body +% \\ +% where option is one of l,r,c standing for left, right, center. +% The format will eventually be used to make several +% tabular environments and you are defining the number of columns +% and the placement of text within the columns of the tabulars. +% Each row is terminated by a \\. Any number of options can +% be on a line, they will each be set in their own columns. +% Any of the options except \body may be left out. +% +% Eg. +% \begin{format} +% \title{l}\employer{r}\\ +% \dates{r}\\ +% \body\\ +% \location{l}\\ +% \end{format} +% +% In this example the title and employer information +% are set in 2 columns left justified and right justified +% respectively. Then the date is set right justified. +% Then the body is set. Then the location is set left +% justified. +% +% \employer{text} +% \title{text} +% \dates{text} +% \location{text} +% declare text for the next invocation of the position +% environment +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Glue +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% sectionskip the amount of horizontal before a section +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Dimensions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% sectionwidth the amount that the section titles go in the +% left margin +% +% resumewidth the width of the total resume from the left +% margin to the right. Don't use textwidth +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Definitions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% sectionfont the font used to print section titles +% use \renewcommand to change it +% +% namefont the font used to print your name +% use \renewcommand to change it +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% THINGS TO DO +% +% add lm,rm options to format style to allow things to be placed +% in the left or right margin respectivly +% +% add capability so that \body doesn't have to be proceeded (followed) +% by a \\ allowing part of the description (eg. location) to be the +% first (last) thing of the body +% +% clean up the list building procedures +% +% write docs to tell people how to use this + +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{res}[2000/05/19 v1.4b Resume class] + +%\DeclareOption{11pt}{\renewcommand\@ptsize{1}} +%\DeclareOption{12pt}{\renewcommand\@ptsize{2}} + +\PassOptionsToClass{11pt,12pt}{article} +\LoadClassWithOptions{article} + +\newif\if@line +\newif\if@margin + +\DeclareOption{line}{\@linetrue} +\DeclareOption{centered}{\@linefalse} + +\DeclareOption{margin}{\@margintrue} +\DeclareOption{overlapped}{\@marginfalse} + +\ExecuteOptions{overlapped,centered} +\ProcessOptions\relax + +\nofiles % resume's don't need .aux files + + +\newtoks\tabular@text % holds the current list being processed +\newtoks\tabular@head % holds the head tabular list +\newtoks\tabular@tail % holds the tail tabular list +\newtoks\@ta % used by \@append +\newtoks\undefined@token\undefined@token={} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% prints a centered name with the address centered +% or the two address on opposite sides of the page +% +\def\@printcentername{\begingroup + % print the name centered + \leavevmode\hbox to \textwidth{\hfil\@tablebox{\namefont\@name}\hfil}\par + \@ifundefined{@addressone}{% + % do nothing + }{% + \@ifundefined{@addresstwo}{ + % only one address + \leavevmode\hbox to \textwidth{\hfil\@tablebox{\@addressone}\hfil}\par + }{ + % two addresses + \leavevmode\hbox to \textwidth{\@tablebox{\@addressone}\hfil + \@tablebox{\@addresstwo}}\par + }% + }% +\endgroup} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% this is used to print the name and address at the top of +% the page with a hline in between +% +\def\namefont{\large\bf} +\def\@linename{\begingroup + \def\\{, } + {\namefont\@name} + \vskip 2pt + \fullline + \vskip 2pt + % where do you live? + \@ifundefined{@addressone}{% + % do nothing + }{% + \leavevmode\hbox to \textwidth + {\hfill\vbox{\hbox{\@addressone} + \hbox{\@addresstwo} + }% + }\par + } +\endgroup} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% HEADINGS: +% There are two types of headings: +% 1) one with the name centered and the address centered or +% in the left and right side if there are two address +% 2) one where the name is in the upper left corner +% the a line accross the paper +% then the address all on one line in the right corner +% the second address will be directly below the first if defined +% +\let\print@name\relax +\def\ds@centered{\ifx\print@name\relax\let\print@name\@printcentername\fi} +\def\ds@line{\ifx\print@name\relax\let\print@name\@linename\fi} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Use this to set the sectionwidth. +% It adjust the width of the text as well as the hoffset +% You probably shouldn't touch any of the size paramaters +% unless you really understand all of this but it is not +% hard. Either way, it can only be executed once +% +\def\sectionfont{\bf} +\newdimen\sectionwidth +\newskip\sectionskip +\newdimen\resumewidth + +\resumewidth=6.5in +\sectionskip=3.5ex plus 1ex minus -.2ex % values stolen from LaTeX + +\def\newsectionwidth#1{% + \sectionwidth=#1 + \textwidth=\resumewidth + \advance\textwidth-\sectionwidth + \hsize=\textwidth + \hoffset=\sectionwidth +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% This is for sectiontitles that are entirely in the left margin. +% multiline sectiontitles are permited and will be broken by +% \TeX{} to fit into a box \verb|\sectionwidth| wide. It is advised +% that \verb|\\| be used to break the lines by hand as \TeX{} will +% probably not do what you want. +% +% When using this with {\tt tabbing} and {\tt list} (or anything +% that is made out of {\tt list}) put the \section's inside of +% the \verb|\begin{}| and the \verb|\item|Eg. +% \begin{verbatim} +% \begin{trivlist} +% \item[] +% \section{foo} +% text +% \end{trivlist} +% \end{verbatim} +% +\def\boxed@sectiontitle#1{% + % this macro may be called in a tabular. Special code must be written + % to accomodate this. In LaTeX, a tabular is made out of hboxes. + % TeX never goes into horizontal mode because of this; it only + % gets into vertical mode and restricted horizontal mode. Certain + % indenting problems must be handled because of this. They + % are delt with at the end of this routine. + % It is also necessary to close the hbox that was created before + % the \section and create a new one when this macro has ended. + % This macro therefore simulates a \kill, so that any text before + % the \section not be printed. The proper use is therefore + % ... + % text\\ + % \section{foo} + % more text\\ + % ... + \ifx\\\@tabcr % is this in a tabular? (this *should* work but is a cludge) + \@stopfield % the is the first part of a \kill + \else + \@@par % This will end the previous paragraph if needed and + % go into vertical mode. If this was already in + % vertical mode then the \par does nothing. + + \fi + \begingroup + \everypar={}% + \def\par{\@@par}% + \let\\=\@normalcr + \addpenalty{\@secpenalty} % this would be a good place for a page break + % \@secpenalty is what LaTeX uses before its + % section's. It happens to be -300 + \addvspace{\sectionskip} % put in a bit of glue + % The following hbox will be contributed to the page list without going + % into horizontal mode. Therefore, any \parindent's, \parshape's, \leftskip + % will be ignored but \hoffset's are not. The result is that the box will + % only by \hoffset. This is what I want + \hbox to 0pt{% + \hss % this is an llap. In other words, this glue + % will shrink by the width of the stuff in the vbox + % (\sectionwidth) into the left margin and then + % insert the contents of the vbox. + \vtop to 0pt{% make a 0pt height paragraph, with the baseline at the + % lined up with the baseline of the first box in the list + \leftskip=0pt + \hsize=\sectionwidth + \textwidth=\sectionwidth + \raggedright % you don't want this filled out to the right margin + \sectionfont + #1\vss % Go into horizontal mode; do the paragraph; + % go into vertical mode; add some negative glue + % to give a box of 0pt height and depth + }% + }% + \addpenalty{-\@secpenalty} % this would be a bad place for a page break + \vskip-\baselineskip % when the next box is processed, baselineskip glue + % glue will be added (the box has no depth because of + % the \vss; therefore, we don't have to worry about + % \lineskiplimit). This -\baselineskip glue + % is to undo this. \nointerlineskip doesn't + % work because the baseline of this line would be lined + % up with the top of the top of the next box. We + % want the baselines lined up. + % + % It may have been possible to do this by forcing the + % baseline of this box to be the top of the box but + % then the interline skip between this box and the + % previous box would be off as the baselines of the + % this box (the one that being made above) and the + % previous line would be separated by \baselineskip + % (probably, it may be separted by the depth of the + % previous box + \lineskip) but as the baseline of + % this box has been moved to the top, the box's would + % separted by to much glue. The exact amount being + % the height of this box. + \endgroup + \ifx\\\@tabcr % is this in a tabular? (this *should* work but is a cludge) + % this is the second part of the \kill; it starts the next tabbing line + % Because this routine will never get into paragraph mode when used in + % tabbing the \parskip that is discussed below will never be inserted. + % Therefore it should not be negated as done below. + \@startline + \ignorespaces + \else + \vskip-\parskip % The next thing to be contributed will be a paragraph. + % Right before being contributed though a \vskip\parskip + % will be inserted. This is to negate it. + % + % I do consider this to be a bit of a cludge but + % I can not find a way to write \unskipfutureskip + % or a way to make TeX think that nothing has + % been contributed to the page list. + \fi +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% This is for sectiontitles that are entirely above the section text +% +\def\unboxed@sectiontitle#1{% + \ifx\\\@tabcr % see boxed@sectiontitle for explation + \@stopfield + \else + \@@par + \fi + \begingroup + \everypar={}% + \def\par{\@@par}% + \def\\{ } + \addpenalty{\@secpenalty} + \addvspace{\sectionskip} + \hbox to 0pt{\hss\hbox to \sectionwidth{\sectionfont#1\hss}} + \addpenalty{-\@secpenalty} % this would be a bad place for a page break + \endgroup + \ifx\\\@tabcr % see boxed@sectiontitle for explation + \@startline + \else + \vskip-\parskip + \fi + \ignorespaces +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% There are two types of section headings: +% 1) the section heading is all on one line and directly +% below it, is the body of the text +% 2) the section heading is entirely in the left margin +% (possibly taking multiple lines) with the body of +% the text next to it +% +\let\@@section\relax +\def\ds@overlapped{\ifx\@@section\relax\newsectionwidth{0.5in}\let + \@@section\unboxed@sectiontitle\fi} +\def\ds@margin{\ifx\@@section\relax\newsectionwidth{1.3in}\let + \@@section\boxed@sectiontitle\fi} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DEFAULTS: (some of them) +% +% centered name +% overlapped section titles +% +% format is: +% title employer +% location dates +% body +% with everything in the left of its column + +%\input article.sty + +\if@line\ds@line\else\ds@centered\fi +\if@margin\ds@margin\else\ds@overlapped\fi + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% typeset resume all nice and pretty +% +\def\Resume{{R\'{e}sum\'{e}}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% makes a line of width \textwidth starting at -\hoffset +% +\def\fullline{ % hrules only listen to \hoffset + \nointerlineskip % so I have this code + \moveleft\hoffset\vbox{\hrule width\textwidth} + \nointerlineskip +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% create a multiline box. +% +\def\@tablebox#1{\begin{tabular}[t]{@{}l@{\extracolsep{\fill}}}#1\end{tabular}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% use this to define your name +% +\def\name#1{\def\@name{#1}} + +\def\@name{} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% use this to define your address, this may be called more than once. +% +\let\@addressone\relax +\let\@addresstwo\relax + +\def\address#1{ + \@ifundefined{@addressone}{\def\@addressone{#1}}{\def\@addresstwo{#1}}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if you want to print your name and address is a slightly +% different format than sugessted, then this can be used +% to place it exactly where you want +% +\def\opening{\def\@opening{} + \begingroup + \leftskip=-\hoffset % I use leftskip to move things to the left as + \advance\textwidth\hoffset % changing hoffset doesn't work. But this + \hsize=\textwidth % doesn't really work as hboxes are rules + % are unaffeted + \let\par=\@@par + \parindent=0pt + \parskip=0pt + \print@name + \endgroup +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% all of the resume goes in the resume environment +% +\newenvironment{resume}{\begingroup + \@ifundefined{@opening}{\opening}{} +}{\endgroup} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% gives you a tabular environment with n equally spaced columns +% \begin{ncolumn}{#} ... \end{ncolumn} +% +% The p option of LaTeX is broken in all but the newest verion +% of latex.tex, this is how to fix it +% +\def\@endpbox{\par\egroup\hfil} +\let\@@endpbox=\@endpbox + +\newdimen\@columnwidth % the width of each column equal to +\def\ncolumn#1{% + % \@columnwidth = \textwidth / #1 + \@columnwidth=\textwidth \divide\@columnwidth by #1 + \begin{tabular*}{\textwidth}[t]% + {*{#1}{@{}p{\@columnwidth}@{\extracolsep{\fill}}}} +} + +\def\endncolumn{\end{tabular*}} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \employer{text} defines employer to be text +% \location{text} defines location to be text +% \dates{text} defines dates to be text +% \title{text} defines title to be text +% \body +% + +\def\employer#1{\def\@employer{\print@employer{#1}}} +\def\location#1{\def\@location{\print@location{#1}}} +\def\dates#1{\def\@dates{\print@dates{#1}}} +\def\title#1{\def\@title{\print@title{#1}}} + +\let\l@justify\raggedright +\let\r@justify\raggedleft +\let\c@justify\centering + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \@format{name}{justify} +% will define \print@#1 to print it's one argument +% justified according to #2 which can be +% l = left +% r = right +% c = center +% +% eg. +% \@format{employer}{c} +% is the same as \def\print@employer#1{{\centering #1\par}} +% +\def\@format#1#2{% + \expandafter\gdef\csname print@#1\endcsname##1{% + {\csname#2@justify\endcsname##1\par}} +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% this is used to define how the position environment should +% formated. +% +% \begin{format} positioning text \end{format} +% where positioning text may be +% \employer{pos} +% \location{pos} +% \dates{pos} +% \title{pos} +% \body (for the body of the position environment) +% where pos is +% l for left +% r for right +% c for center +% use \\ to break the line +% you don't have to use all of the options. +% on any one line, you should indicate what you want on that line +% and where it should go within its column. +% eg. +% the following prints the employer in the left with the location +% centered within that its column. It then prints the date on the +% right. Then it prints the body of the position environment. Then +% it prints the title centered within its column; as there is only +% one column here it is really just centered. +% +% \begin{format} +% \employer{l}\location{c}\\ +% \dates{r}\\ +% \body\\ +% \title{c}\\ +% \end{format} + +\newcounter{numberofcolumns} +\newenvironment{format}{% + \def\end@line@head{\append@tabular@head{tabular@text}\tabular@text={}% + \c@numberofcolumns 0} + \def\end@line@tail{\append@tabular@tail{tabular@text}\tabular@text={}% + \c@numberofcolumns 0} + \tabular@text={} + \tabular@head={} + \tabular@tail={} + \c@numberofcolumns 0 + \let\\=\end@line@head + \def\employer##1{\advance\c@numberofcolumns 1 + \@format{employer}{##1} + \append@tabular@text{employer}} + \def\location##1{\advance\c@numberofcolumns 1 + \@format{location}{##1} + \append@tabular@text{location}} + \def\dates##1{\advance\c@numberofcolumns 1 + \@format{dates}{##1} + \append@tabular@text{dates}} + \def\title##1{\advance\c@numberofcolumns 1 + \@format{title}{##1} + \append@tabular@text{title}} + \def\body{\iftoks\tabular@head\undefined@token\then + \else + \@append{\noexpand\\}\to\tabular@head + \skotfi + \let\\=\end@line@tail}}{} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%taken from page 378 of TeXbook but freely hacked +% +% appends the expansion of #1 to the token list #2 + +\def\@append#1\to#2{% + \@ta=\expandafter{#1}% + \xdef\@append@temp{\the#2\the\@ta} + \global#2=\expandafter{\@append@temp}% +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% CHAA006%vaxb.rhbnc.ac.uk@NSS.Cs.Ucl.AC.UK +% texhax.88.078 +% is used to see if two token lists are equal +% there must be a better way +% + +\let \then = \empty +\def \iftoks #1#2\then #3\else #4\skotfi{ + \edef \1{\the #1} + \edef \2{\the #2} + \ifx \1\2\then #3\else #4\fi} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \append@tabular@text{command} +% +% appends command to the end of \tabular@text. +% NOTE: command MUST be a command but without the \ +% Eg. \append@tabular@text{relax} +% +% used to define \tabular@text for the tabular environment +% used by append@tabular@head and append@tabular@tail +% + +\def\append@tabular@text#1{% +\iftoks\tabular@text\undefined@token\then + \global\tabular@text=\expandafter{\csname @#1\endcsname} +\else + \@append{&}\to\tabular@text + \@append{\csname @#1\endcsname}\to\tabular@text +\skotfi +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% append@tabular@head +% +% appends command to the end of \tabular@text@head +% NOTE: command MUST be a command but without the \ +% Eg. \append@tabular@head{relax} +% +% used to define \tabular@head for the tabular environment +% used by the position environment +% +\def\append@tabular@head#1{% + \ifnum\the\c@numberofcolumns=0\relax + \else + \iftoks\tabular@head\undefined@token\then + \relax + \else + \@append{\noexpand\\}\to\tabular@head + \@append{\noexpand\penalty-\@secpenalty}\to\tabular@head + \skotfi + \@append{\noexpand\begin{ncolumn}}\to\tabular@head + \@append{\expandafter{\the\c@numberofcolumns}}\to\tabular@head + \@append{\the\csname#1\endcsname}\to\tabular@head + \@append{\noexpand\end{ncolumn}}\to\tabular@head + \fi +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% append@tabular@tail +% +% appends command to the end of \tabular@text@htail +% NOTE: command MUST be a command but without the \ +% Eg. \append@tabular@tail{relax} +% +% used to define \tabular@tail for the tabular environment +% used by the position environment +% +\def\append@tabular@tail#1{% + \ifnum\the\c@numberofcolumns=0\relax + \else + \iftoks\tabular@tail\undefined@token\then + \else + \@append{\noexpand\\}\to\tabular@tail + \@append{\noexpand\penalty-\@secpenalty}\to\tabular@tail + \skotfi + \@append{\noexpand\begin{ncolumn}}\to\tabular@tail + \@append{\expandafter{\the\c@numberofcolumns}}\to\tabular@tail + \@append{\the\csname#1\endcsname}\to\tabular@tail + \@append{\noexpand\end{ncolumn}}\to\tabular@tail + \fi +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% put the actual job descriptions here +% \begin{postion} ... \end{position} +% in the ... describe the position. +% don't put the \dates \location etc in here. define them before hand +\newenvironment{position}% + {% + \begingroup + \par + \the\tabular@head +% \addpenalty{-\@secpenalty}% bad place for a page break + \penalty -\@secpenalty % bad place for a page break + \penalty 10000 + \ignorespaces + }{% + \the\tabular@tail +% \addpenalty{\@secpenalty}% good place for a page break + \penalty \@secpenalty % good place for a page break + \endgroup +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DEFAULTS: (the rest of them) +% +% centered name +% overlapped section titles +% +% format is: +% title employer +% location dates +% body +% with everything in the left of its column + +\@secpenalty = -500 +\topmargin 0pt +\headheight 0pt +\headsep 0pt +\textheight 9in +\parindent 0pt +\topmargin 0in +\oddsidemargin 0pt +\evensidemargin 0pt +\marginparwidth 0pt +\parindent 0pt +\parskip \baselineskip +\setcounter{secnumdepth}{0} +\def\@listI{\leftmargin\leftmargini +\topsep 0pt +\parskip 0pt +\partopsep 2pt plus 2pt +\parsep 2pt plus 2pt +\itemsep \parsep} + +\pagestyle{empty} % don't want page numbers + +\begin{format} +\title{l}\employer{r}\\ +\location{l}\dates{r}\\ +\body\\ +\end{format} + +\let\section\@@section diff --git a/public/lib/templates/template6/index.ts b/public/lib/templates/template6/index.ts new file mode 100644 index 00000000..b1311979 --- /dev/null +++ b/public/lib/templates/template6/index.ts @@ -0,0 +1,267 @@ +import { stripIndent, source } from 'common-tags' +import { WHITESPACE } from '../constants' +import type { FormValues, Generator } from '../../../types' + +const generator: Omit<Generator, 'resumeHeader'> = { + profileSection(basics) { + if (!basics) { + return '' + } + + const { name = '', email, phone, location = {}, website } = basics + const info = [email, phone, location.address, website].filter(Boolean) + + return stripIndent` + \\begin{center} + % Personal + % ----------------------------------------------------- + {\\fontsize{\\sizeone}{\\sizeone}\\fontspec[Path = fonts/,LetterSpace=15]{Montserrat-Regular} ${name.toUpperCase()}} + ${name && info.length > 1 ? '\\\\' : ''} + \\vspace{2mm} + {\\fontsize{1em}{1em}\\fontspec[Path = fonts/]{Montserrat-Light} ${info.join( + ' -- ' + )}} + \\end{center} + ` + }, + + educationSection(education, heading) { + if (!education) { + return '' + } + + return source` + % Chapter: Education + % ------------------ + + \\chap{${heading ? heading.toUpperCase() : 'EDUCATION'}}{ + + ${education.map((school) => { + const { + institution = '', + location = '', + area = '', + studyType = '', + score = '', + startDate = '', + endDate = '' + } = school + + const degreeLine = [studyType, area].filter(Boolean).join(' ') + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} – ${endDate}` + } else if (startDate) { + dateRange = `${startDate} – Present` + } else { + dateRange = endDate + } + + return stripIndent` + \\school + {${institution}} + {${dateRange}} + {${degreeLine}} + {${location}} + {${score + ? `\\begin{newitemize} + \\item ${score ? `GPA: ${score}` : ''} + \\end{newitemize}` + : '' + } + } + ` + })} + } + ` + }, + + workSection(work, heading) { + if (!work) { + return '' + } + + return source` + % Chapter: Work Experience + % ------------------------ + \\chap{${heading ? heading.toUpperCase() : 'EXPERIENCE'}}{ + + ${work.map((job) => { + const { + company = '', + position = '', + location = '', + startDate = '', + endDate = '', + highlights = [] + } = job + + let dateRange = '' + let dutyLines = '' + + if (startDate && endDate) { + dateRange = `${startDate} – ${endDate}` + } else if (startDate) { + dateRange = `${startDate} – Present` + } else { + dateRange = endDate + } + + if (highlights) { + dutyLines = source` + \\begin{newitemize} + ${highlights.map((duty) => `\\item {${duty}}`)} + \\end{newitemize} + ` + } + + return stripIndent` + \\job + {${company}} + {${dateRange}} + {${position}} + {${location}} + {${dutyLines}} + ` + })} + } + ` + }, + + skillsSection(skills, heading) { + if (!skills) { + return '' + } + + return source` + % Chapter: Skills + % ------------------------ + + \\chap{${heading ? heading.toUpperCase() : 'SKILLS'}}{ + \\begin{newitemize} + ${skills.map((skill) => { + const { name = '', keywords = [] } = skill + + let item = '' + + if (name) { + item += `${name}: ` + } + + if (keywords.length > 0) { + item += keywords.join(', ') + } + + return `\\item ${item}` + })} + \\end{newitemize} + } + ` + }, + + projectsSection(projects, heading) { + if (!projects) { + return '' + } + + return source` + % Chapter: Projects + % ------------------------ + + \\chap{${heading ? heading.toUpperCase() : 'PROJECTS'}}{ + + ${projects.map((project) => { + const { name = '', highlights = [], keywords = [], url = '' } = project + + const highlightsList = + highlights.length > 0 + ? stripIndent` + \\begin{newitemize} + ${highlights.map((highlight) => `\\item {${highlight}}`)} + \\end{newitemize} + ` + : '' + + return stripIndent` + \\project + {${name}} + {${keywords.join(', ')}} + {${url}} + {${highlightsList}} % Include the highlights list here + ` + })} + } + ` + }, + + awardsSection(awards, heading) { + if (!awards) { + return '' + } + + return source` + % Chapter: Awards + % ------------------------ + + \\chap{${heading ? heading.toUpperCase() : 'AWARDS'}}{ + + ${awards.map((award) => { + const { title = '', summary = '', awarder = '', date = '' } = award + + return stripIndent` + \\award + {${title}} + {${date}} + {${summary}} + {${awarder}} + ` + })} + } + ` + } +} + +function template6(values: FormValues) { + const { headings = {} } = values + + return stripIndent` + \\documentclass[10pt]{article} + \\usepackage[english]{babel} + \\input{config/minimal-resume-config} + \\begin{document} + ${values.sections + .map((section) => { + switch (section) { + case 'profile': + return generator.profileSection(values.basics) + + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection(values.projects, headings.projects) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n')} + ${WHITESPACE} + \\end{document} + ` +} + +export default template6 diff --git a/public/lib/templates/template6/inputs/config/custom-command.tex b/public/lib/templates/template6/inputs/config/custom-command.tex new file mode 100644 index 00000000..13756ba7 --- /dev/null +++ b/public/lib/templates/template6/inputs/config/custom-command.tex @@ -0,0 +1,2 @@ +% Note: Put your custom commands here. Left empty intentionally. +\pagenumbering{gobble} diff --git a/public/lib/templates/template6/inputs/config/minimal-resume-config.tex b/public/lib/templates/template6/inputs/config/minimal-resume-config.tex new file mode 100644 index 00000000..5b6a3c44 --- /dev/null +++ b/public/lib/templates/template6/inputs/config/minimal-resume-config.tex @@ -0,0 +1,7 @@ +%sty file + +\usepackage{config/minimal-resume} + +% custom command and packages + +\input{config/custom-command} diff --git a/public/lib/templates/template6/inputs/config/minimal-resume.sty b/public/lib/templates/template6/inputs/config/minimal-resume.sty new file mode 100644 index 00000000..abe85dda --- /dev/null +++ b/public/lib/templates/template6/inputs/config/minimal-resume.sty @@ -0,0 +1,109 @@ +\ProvidesPackage{config/minimal-resume} + +% margin +\usepackage[top=1in, bottom=1in, left=1in, right=1in]{geometry} + +% minimal custom packages +\usepackage[T1]{fontenc} +\usepackage{fontspec} +\usepackage[babel=true]{microtype} +\usepackage[fontsize=10.75pt]{scrextend} +\usepackage{enumitem} + +\defaultfontfeatures{Ligatures=TeX} + +% font families +\newfontfamily{\montserratfont}[Path=fonts/,BoldFont=Montserrat-Bold]{Montserrat-Regular} +\newfontfamily{\crimsonfont}[Path=fonts/,ItalicFont=CrimsonText-Italic]{CrimsonText-Regular} + +% main font for the document +\setmainfont[Path=fonts/, ItalicFont=CrimsonText-Italic]{CrimsonText-Regular} + +% font sizes +\newcommand{\sizeone}{1.618em} +\newcommand{\sizetwo}{1.318em} +\newcommand{\sizethree}{1em} +\newcommand{\sizefour}{0.618em} +\newcommand{\sizefive}{0.382em} +\newcommand{\sizesix}{0.236em} + +% line spaces +\newcommand{\linespaceone}{1} + +\newenvironment{newitemize} + {\itemize[nolistsep,topsep=\sizefive,itemsep=\sizefive,labelsep=\sizefour,leftmargin=*]} + {\enditemize} + +\newcommand{\personal}[3]{ + \begin{center} + % name + { + \fontsize{\sizeone}{\sizeone}\fontspec[Path = fonts/,LetterSpace=15]{Montserrat-Regular}#1 + }\\ + % address + \vspace{\sizethree} + { + \fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/,LetterSpace= 10]{Montserrat-Light}#2 + }\\ + % contact + \vspace{\sizefive} + { + \fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{Montserrat-Light}#3 + } + \end{center} +} + +\newcommand{\chap}[2]{ + \vspace{\sizethree} + \raggedright + {\hrule height 0.5pt} + \vspace{\sizefive} + \begin{addmargin}[\sizefive]{\sizefive}{ + { + \fontsize{\sizefour}{\sizefour}\fontspec[Path = fonts/,LetterSpace=10]{Montserrat-Bold} + \textbf{#1} + } + \vspace{\sizefour} + {#2} + } + \end{addmargin} +} + +\newcommand{\subchap}[3]{ + \vspace{\sizefive} + {\fontsize{\sizetwo}{\sizetwo}\fontspec[Path = fonts/]{CrimsonText-SemiBold} #1} \hfill {\fontsize{\sizetwo}{\sizetwo}\fontspec[Path = fonts/]{CrimsonText-Regular} #2} + {#3} + \vspace{\sizefive} +} + +\newcommand{\school}[5]{ + \vspace{\sizefive} + {\fontsize{\sizetwo}{\sizetwo}\fontspec[Path = fonts/]{CrimsonText-SemiBold} #1} \hfill {\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular} #2} + + {\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular} #3}\hfill{\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular}#4}\\#5 + \vspace{\sizefive} +} + +\newcommand{\job}[5]{ + \vspace{\sizefive} + {\fontsize{\sizetwo}{\sizetwo}\fontspec[Path = fonts/]{CrimsonText-SemiBold} #1} \hfill {\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular} #2} + + {\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular} #3} \hfill {\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular} #4} + {#5} + \vspace{\sizefive} +} + +\newcommand{\project}[4]{ + \vspace{\sizefive} + {\fontsize{\sizetwo}{\sizetwo}\fontspec[Path = fonts/]{CrimsonText-SemiBold} #1} {\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular} #2} \hfill {\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular} #3} + \\#4 + \vspace{\sizefive} +} + +\newcommand{\award}[4]{ + \vspace{\sizefive} + {\fontsize{\sizetwo}{\sizetwo}\fontspec[Path = fonts/]{CrimsonText-SemiBold} #1} \hfill {\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular} #2} + + {\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular} #3} \hfill {\fontsize{\sizethree}{\sizethree}\fontspec[Path = fonts/]{CrimsonText-Regular} #4} + \vspace{\sizefive} +} diff --git a/public/lib/templates/template6/inputs/fonts/CrimsonText-Bold.ttf b/public/lib/templates/template6/inputs/fonts/CrimsonText-Bold.ttf new file mode 100644 index 00000000..7e2772c4 Binary files /dev/null and b/public/lib/templates/template6/inputs/fonts/CrimsonText-Bold.ttf differ diff --git a/public/lib/templates/template6/inputs/fonts/CrimsonText-BoldItalic.ttf b/public/lib/templates/template6/inputs/fonts/CrimsonText-BoldItalic.ttf new file mode 100644 index 00000000..b71ae01b Binary files /dev/null and b/public/lib/templates/template6/inputs/fonts/CrimsonText-BoldItalic.ttf differ diff --git a/public/lib/templates/template6/inputs/fonts/CrimsonText-Italic.ttf b/public/lib/templates/template6/inputs/fonts/CrimsonText-Italic.ttf new file mode 100644 index 00000000..7d86331e Binary files /dev/null and b/public/lib/templates/template6/inputs/fonts/CrimsonText-Italic.ttf differ diff --git a/public/lib/templates/template6/inputs/fonts/CrimsonText-Regular.ttf b/public/lib/templates/template6/inputs/fonts/CrimsonText-Regular.ttf new file mode 100644 index 00000000..4dda4ed6 Binary files /dev/null and b/public/lib/templates/template6/inputs/fonts/CrimsonText-Regular.ttf differ diff --git a/public/lib/templates/template6/inputs/fonts/CrimsonText-Roman.ttf b/public/lib/templates/template6/inputs/fonts/CrimsonText-Roman.ttf new file mode 100644 index 00000000..67acd706 Binary files /dev/null and b/public/lib/templates/template6/inputs/fonts/CrimsonText-Roman.ttf differ diff --git a/public/lib/templates/template6/inputs/fonts/CrimsonText-SemiBold.ttf b/public/lib/templates/template6/inputs/fonts/CrimsonText-SemiBold.ttf new file mode 100644 index 00000000..5e24039a Binary files /dev/null and b/public/lib/templates/template6/inputs/fonts/CrimsonText-SemiBold.ttf differ diff --git a/public/lib/templates/template6/inputs/fonts/CrimsonText-SemiBoldItalic.ttf b/public/lib/templates/template6/inputs/fonts/CrimsonText-SemiBoldItalic.ttf new file mode 100644 index 00000000..50b3f44b Binary files /dev/null and b/public/lib/templates/template6/inputs/fonts/CrimsonText-SemiBoldItalic.ttf differ diff --git a/public/lib/templates/template6/inputs/fonts/Montserrat-Bold.ttf b/public/lib/templates/template6/inputs/fonts/Montserrat-Bold.ttf new file mode 100644 index 00000000..ae33a453 Binary files /dev/null and b/public/lib/templates/template6/inputs/fonts/Montserrat-Bold.ttf differ diff --git a/public/lib/templates/template6/inputs/fonts/Montserrat-Light.otf b/public/lib/templates/template6/inputs/fonts/Montserrat-Light.otf new file mode 100644 index 00000000..a01805ff Binary files /dev/null and b/public/lib/templates/template6/inputs/fonts/Montserrat-Light.otf differ diff --git a/public/lib/templates/template6/inputs/fonts/Montserrat-Regular.ttf b/public/lib/templates/template6/inputs/fonts/Montserrat-Regular.ttf new file mode 100644 index 00000000..5b4b5afe Binary files /dev/null and b/public/lib/templates/template6/inputs/fonts/Montserrat-Regular.ttf differ diff --git a/public/lib/templates/template7/index.ts b/public/lib/templates/template7/index.ts new file mode 100644 index 00000000..a1285f69 --- /dev/null +++ b/public/lib/templates/template7/index.ts @@ -0,0 +1,269 @@ +import { stripIndent, source } from 'common-tags' +import { WHITESPACE } from '../constants' +import type { FormValues, Generator } from '../../../types' + +const generator: Generator = { + profileSection(basics = {}) { + const { name, email, phone, location = {}, website } = basics + + return stripIndent` + % Profile + \\name{${name || ''}}{} + \\address{${location.address || ''}} + ${phone ? `\\phone[mobile]{${phone}}` : ''} + ${email ? `\\email{${email || ''}}` : ''} + ${website ? `\\homepage{${website || ''}}` : ''} + ` + }, + + educationSection(education, heading) { + if (!education) { + return '' + } + + return source` + \\section{${heading || 'Education'}} + ${education.map((school) => { + const { + institution, + studyType = '', + area = '', + score, + location, + startDate, + endDate = '' + } = school + + let degreeLine = '' + + if (studyType && area) { + degreeLine = `${studyType} in ${area}` + } else if (studyType || area) { + degreeLine = studyType || area + } + + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } + + return stripIndent` + \\cventry + {${dateRange || ''}} + {${degreeLine}} + {${institution || ''}} + {${score ? `GPA: ${score}` : ''}} + {\\textit{${location || ''}}} + {} + ` + })} + ` + }, + + workSection(work, heading) { + if (!work) { + return '' + } + + return source` + \\section{${heading || 'Experience'}} + ${work.map((job) => { + const { + company, + position, + location, + startDate, + endDate = '', + highlights + } = job + + let dateRange = '' + let highlightLines = '' + + if (startDate && endDate) { + dateRange = `${startDate} -- ${endDate}` + } else if (startDate) { + dateRange = `${startDate} -- Present` + } else { + dateRange = endDate + } + + if (highlights) { + highlightLines = source` + \\begin{itemize}% + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + } + + return stripIndent` + \\cventry + {${dateRange || ''}} + {${position || ''}} + {${company || ''}} + {${location || ''}} + {} + {${highlightLines}} + ` + })} + ` + }, + + skillsSection(skills, heading) { + if (!skills) { + return '' + } + + return source` + \\section{${heading || 'Skills'}} + ${skills.map((skill) => { + const { name, keywords = [] } = skill + return `\\cvitem{${name || ''}}{${keywords.join(', ')}}` + })} + ` + }, + + projectsSection(projects, heading) { + if (!projects) { + return '' + } + + return source` + \\section{${heading || 'Projects'}} + ${projects.map((project) => { + const { name, highlights = [], keywords = [], url } = project + + let highlightLines = '' + + if (highlights) { + highlightLines = source` + \\begin{itemize}% + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + } + + return stripIndent` + \\cventry + {} + {${name || ''}} + {} + {\\textit{${keywords.join(', ')}}} + {} + {${url || ''}} + {${highlightLines}} + \\vspace{1mm} + ` + })} + ` + }, + + awardsSection(awards, heading) { + if (!awards) { + return '' + } + + return source` + \\section{${heading || 'Awards'}} + ${awards.map((award) => { + const { title, summary, date, awarder } = award + + let detailsLine = '' + + if (summary) { + detailsLine += `${summary}\\\\` + } + + if (awarder) { + detailsLine += awarder + } + + return stripIndent` + \\cventry + {} + {${title || ''}} + {} + {\\textit{${date || ''}}} + {} + {${detailsLine}} + \\vspace{1mm} + ` + })} + ` + }, + + resumeHeader() { + return stripIndent` + %% start of file 'template.tex'. + %% Copyright 2006-2013 Xavier Danaux (xdanaux@gmail.com). + % + % This work may be distributed and/or modified under the + % conditions of the LaTeX Project Public License version 1.3c, + % available at http://www.latex-project.org/lppl/. + + + \\documentclass[letterpaper]{moderncv} % possible options include font size ('10pt', '11pt' and '12pt'), paper size ('a4paper', 'letterpaper', 'a5paper', 'legalpaper', 'executivepaper' and 'landscape') and font family ('sans' and 'roman') + \\usepackage{textcomp} + % moderncv themes + \\moderncvstyle{classic} % style options are 'casual' (default), 'classic', 'oldstyle' and 'banking' + \\moderncvcolor{blue} % color options 'blue' (default), 'orange', 'green', 'red', 'purple', 'grey' and 'black' + %\\renewcommand{\\familydefault}{\\sfdefault} % to set the default font; use '\\sfdefault' for the default sans serif font, '\\rmdefault' for the default roman one, or any tex font name + %\\nopagenumbers{} % uncomment to suppress automatic page numbering for CVs longer than one page + + % character encoding + \\usepackage[utf8]{inputenc} % if you are not using xelatex ou lualatex, replace by the encoding you are using + %\\usepackage{CJKutf8} % if you need to use CJK to typeset your resume in Chinese, Japanese or Korean + + % adjust the page margins + \\usepackage[scale=0.75]{geometry} + %\\setlength{\\hintscolumnwidth}{3cm} % if you want to change the width of the column with the dates + %\\setlength{\\makecvtitlenamewidth}{10cm} % for the 'classic' style, if you want to force the width allocated to your name and avoid line breaks. be careful though, the length is normally calculated to avoid any overlap with your personal info; use this at your own typographical risks... + ` + } +} + +function template7(values: FormValues) { + const { headings = {} } = values + + return stripIndent` + ${generator.resumeHeader()} + ${generator.profileSection(values.basics)} + \\begin{document} + ${values.basics ? '\\makecvtitle' : ''} + ${values.sections + .map((section) => { + switch (section) { + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection(values.projects, headings.projects) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n')} + ${WHITESPACE} + \\end{document} + ` +} + +export default template7 diff --git a/public/lib/templates/template7/inputs/CHANGELOG b/public/lib/templates/template7/inputs/CHANGELOG new file mode 100644 index 00000000..245eda72 --- /dev/null +++ b/public/lib/templates/template7/inputs/CHANGELOG @@ -0,0 +1,406 @@ +version 2.3.1 (2022-02-21) +- Fix duplicate GitLab icon (#105) +- Revert using detokenize in social links (#97) +- Fix broken compilation in classic style (#96) + +version 2.3.0 (2021-12-16) +- Remove font loading from class (#87) +- Add Matrix and Signal icon (#84) +- Improved symbol loading (#84) + +version: 2.2.0 (2021-07-28) +- Remove dot in cventry when using moderncvbodyi. +- Remove http baseurl in hyperref. +- Change font encoding to use fontspec with Latin Modern for luatex and xetex, + else inputenc / fontenc / lmodern (https://tex.stackexchange.com/a/496643). +- Add birthdate field command. +- Add Social entries for WhatsApp, Signal and Matrix. +- Fix Researcher ID not showing (#29). +- Make options 'symbols' and 'nosymbols' available to all styles to toggle whether + symbols should be used or not. Include symbols in oldstyle by default. +- Migrate older newcommand syntax in moderncvcollection.sty to the xparse syntax. +- Fix resumé typo in template. Is now résumé. +- Various other minor fixes. + +version 2.1.0 (21 Jan 2021) +- maintainer change: now team maintained (https://github.com/moderncv), since + original repository is basically dead since 2016. +- new \social options: Xing, Skype, GitLab, Bitbucket, stack overflow, ORCID, + ResearcherID, ResearchGate, Telegram and Google Scholar +- hyperlinks in phone numbers +- switch from l3regex to expl3 +- new skill matrix feature +- move to fonawesome5 package +- default to https + +version 2.0.0 (28 Jul 2015) + - refactored the code into heads, body, foot and icon substyles. All styles + (classic, casual, banking and oldstyle) are just a combination of these and + some font selection. Mixing substyles (e.g., the banking header with the + classic body) is now trivial by using the \moderncvhead, \moderncvbody, + \moderncvfoot and \moderncvicons commands. Each of these take a substyle number + as argument. \moderncvcolor takes a color name as argument. + - added a new style, "fancy". + - added an optional argument to \moderncvstyle to specify style options, i.e. + \moderncvstyle[options]{style}. Below is a list of the available options per + style: + * classic + > to specify of one's name should appear left or right at the top: "left" + (default) or "right; + * casual + > to specify of one's name should appear left or right at the top: "left" + (default) or "right; + * banking + > to specify how the section- and subsectionrules should be set: + "fullrules", "shortrules", "mixedrules" (default; full rules for sections, + short rules for subsections), "centered" (fullrules with centered title) + and "norules" (norules, small caps font); + > to specify how the body should be aligned: left" (default), "center" or + "right"; + * oldstyle & fancy + n/a + - added a new color variant: "burgundy". + - corrected the color of \addressstyle to match the one effectively used + (color2). + - adjusted the bibliography spacing to handle entries with or without labels. + - added a check on the emptyness of \title when setting the hyperref document + properties. + +version 1.5.1 (29 Apr 2013) + - made sure that XeLaTeX or LuaLaTeX is in use before loading the awesome icon + set and if not, revert to the marvosym icon set. + +version 1.5.0 (23 Apr 2013) + - added a command to showcase social accounts in one's personal information: + \social. The command currently handles automatically LinkedIn, Twitter and + Github accounts, and other links can be provided explicitly. + - added a new icon set: "awesome" (using the icons from the Font Awesome font). + - set the "awesome" icon set as the default for the "casual" and "banking" + style variants (can be changed back with \moderncvicons{marvosym}). + - forced all the icons of the "letters" icon set to be of the same width, for + alignment purpose. + - added a letter icon ("W") for the homepage of the "letters" icon set. + - forced some white space between the main text and the footer of the "casual" + style variant. + - removed the rule below the headings of the cvcolumns environment. + +version 1.4.0 (28 Mar 2013) + - deprecated \phone, \mobile and \fax in favour of \phone[<type>], where <type> + can be "fixed" (default), "mobile" or "fax". As part of the change, one can now + use each of these multiple times, to e.g. display multiple mobile phone numbers. + - deprecated \firstname and \familyname in favour of \name{<first>}{<last>}. + - added a new mechanism to select amongs different possible icon sets: + \moderncvicons{<iconsetname>}, where <iconsetname> can be "marvosym" (used by + default in the "banking", "casual" and "classic" style variants) or "letters" + (used by default in the "oldstyle" style variant). \moderncvicons should + always be called after \moderncvstyle in order to override the style variants + defaults. + - added a command to control the font of the page numbering: \pagenumberfont, + as requested by fr1a1nky (launchpad question #224496). + - removed the use of the suffix package. + +version 1.3.0 (09 Feb 2013) + - added a new environment to create multiple columns: cvcolumns. Each column + is then created by \cvcolumn[width]{header}{content}, where the optional width + is given as a fraction of the total width (between 0 and 1). The header and + content are robust and can contain any paragraph command (e.g., a nest itemize + environment). + - added a macro (\pdfpagemode) to control what is visible upon opening compiled + pdfs (assuming pdf reader support), as suggested by U. Stöhr. + Possible values include: "UseNone" (only the document), "UseThumbs" (show + thumbnails), "UseOutlines" (show bookmarks) and "FullScreen" (open in + fullscreen mode). + - added a 3rd, fully optional (can be omitted or left blank) argument to + \address to specify a country, as requested on launchpad (launchpad bug + #1063995). + - compacted list environments further. + - replaced the use of the xargs package by the xparse one. + +version 1.2.1 (04 Dec 2012) + - fixed a regression bug introduced in version 1.2.0 in the header of the + "banking" style when no title is used, as reported on tex.stackexchange + (question #85427). + +version 1.2.0 (31 Oct 2012) + - updated the "banking" style header to include the option to show a title. + - set the values of \arrayrulewidth and \doublerulesep to their standard values + (0.4pt and 2pt resp.) to enable the drawing of rules in tabulars and arrays by + default. + - modified the code of \makecvtitle and \makelettertitle of the "casual" style + to avoid it to cause horizontal alignment issues after and before itself. + - corrected a bug in \makelettertitle of most styles that displayed the current + date (\today) instead of the date given through the \date command, as reported + by B. Schlimmchen and S. Fnord. + - removed the need to set pdfpagelabels=false when loading hyperref, by putting + \pagenumbering{arabic} (to define \thepage) before loading hyperref, as figured + out by J. Wolf. + - corrected the line wrapping of \cvlistitem of the "banking" style. + - corrected a bug in \makecvtitle and \makelettertitle of the "banking" style. + - removed an unwanted space in the footer of the "casual" style. + - moved the font style definitions to moderncv.cls for better readability + (moderncv.cls is meant to be a sort of header file, implementing only some + macros shared by all styles and defining the macros that the style files need + to implement). + +version 1.1.3 (10 Aug 2012) + - corrected a longstanding issue causing hyperref to issue two warnings + regarding its "pdfpagelabels" option, as pointed out and solved by P. Leifeld + (launchpad bug #1035466). + +version 1.1.2 (09 Aug 2012) + - fixed a regression bug introduced in version 1.0.0 in the footer of the + "casual" style, as discovered on tex.stackexchange (question #66316). + +version 1.1.1 (30 Jul 2012) + - fixed a compatibility issue introduced in version 1.0.0 when + \maketitlenamewidth was renamed to \makecvtitlenamewidth, as reported by Peppe + on launchpad (launchpad bug #1030802). The template now correctly uses + \makecvtitlenamewidth, and \maketitlenamewidth was created as an alias for + backward compatibility. + +version 1.1.0 (29 Jul 2012) + - fixed the switching from letter to resume, correcting spacing errors when a + letter is typeset before the resume, as noticed by U. Gabor. + - fixed the vertical alignment of the footers, as reported by T. Homa. + Footers are now aligned to the bottom and the letter and cv footers are + perfectly aligned in the "casual" style. + - prepared moderncv for fontspec font loading (still commented in code). + - changed the handling of the "sans" and "roman" class options, to be reflected + at the beginning of the document and override style font choices. + - turned unicode support in hyperref on by default. + - tweaked the use of \textbullet to avoid the fall-back to Computer Modern + fonts and prepared the use of symbols from the MarVoSym font for fontspec + (LauLaTeX or XeLaTeX). + - tweaked the \subsectionfill of the "banking" style to distribute extra space + evenly between leaders. + - added two options to change the "Enclosure" string used for the letter + enclosure: either specify another string as optional argument to \enclosure, + or redefine \enclname, as suggested by D. Wille. + +version 1.0.0 (26 Mar 2012) + - added commands to generate letters for every resume style: \recipient, \date, + \opening, \closing, \enclosure, \makelettertitle and \makeletterclosing. The + old \maketitle and \makefooter commands are now deprecated and replaced by + \makecvtitle and \makecvfooter. + - changed the alignment algorithm for the personal data display in the oldstyle + style, as to align on the baseline of the first line with the surrounding text. + +version 0.19.0 (06 Feb 2012) + - reintroduced the ability to force the width reserved to display the name + in the resume header for the classic style (\maketitlenamewidth). + - improved the pdf metadata, as reported by S. Wunsch (launchpad bug #922476). + - fixed a footersymbol bug in the casual style when no mobile number was given, + as reported by S. Wunsch (launchpad bug #922470). + - fixed a display bug when an address was given without postcode/city, as + reported by O. Shaneh (launchpad bug #670263). + +version 0.18.0 (05 Feb 2012) + - corrected the handling of pdf bookmarks, as suggested on stackexchange by + U. Fischer. + - improved the spacing between sections and subsections by using \addvspace + instead of \vspace. + - corrected the spacing between entries with nested itemize environments + (temporary solution working only for single line items). + - added a check in the oldstyle style for an empty 4th argument in the + \cvdoubleitem definition, to avoid printing a colon without preceding label. + - added a new style on top of classic, casual and oldstyle: banking. + +version 0.17.0 (25 Jan 2012) + - changed the footer algorithm of style casual to avoid starting lines with + the footer symbol. + - aligned the space before and after the title across styles. + - added an optional title to the casual style. + - changed the definition of the font styles to avoid undesired extra spacing. + - added a Spanish template, kindly provided by I. Buitrón. + - corrected the vertical misalignment between the page number and the center + footer in the casual style. + +version 0.16.0 (15 Jan 2012) + - added starred versions of \section and \subsection (that are identical to + their non-starred version, to e.g. enable biblatex support as requested by + S. Verberkt (launchpad bug #913102). + - corrected a misalignment of the colored rule in front of the section titles + in the classic and casual styles, as reported by P. Neidhardt (launchpad bug + #915910). + +version 0.15.1 (23 December 2011) + - corrected a bug in the classic style causing the address font and color not + being carried over newlines, as reported by J. Smith. + +version 0.15.0 (19 December 2011) + - corrected list spacing. + - corrected inconsistent use of sans serif fonts in roman layout option. + - the lmodern fonts are now automatically loaded only if installed on the + system. The "nolmodern" option is now therefore obsolete. + - complete code refactoring separating themes in separate styles and colors. + - renamed \cvline to \cvitem, \cvlanguage to \cvitemwithcomment and \cvcomputer + to \cvdoubleitem (the old command name still work and redirect to the new ones, + but are deprecated). + - removed the arbitrary minipage widths of skill proficiency vs comment in + \cvitemwithcomments. The skill proficiency is now typeset exactly as given + (i.e. one one line if no linebreaks are implicitly given) and the comment uses + the remaining horizontal space. + - changed the optional argument of \cvlistitem and \cvlistdoubleitem to specify + the vertical skip after the item (as for \cvitem, cvitemwithcomments, etc). + The way to change the list symbol is to redefine \listitemsymbol. + - added a new style on top of classic and casual: oldstyle. + - loaded the microtype package to improve typography. + +version 0.14.0 (04 December 2011) + - added support for CJK, thanks to the help of P. D'Apice. + - the use of \recomputelengths after modifying any length in the preamble is + now unnecessary; \recomputelength is automatically called at the start of the + document. + +version 0.13.1 (11 November 2011) + - corrected a bug introduced by v0.13 in the classic style when no \photo is + used, as reported by S. Gislais (launchpad bug #888702). + +version 0.13.0 (06 November 2011) + - added a "black" color option to render the resume in black & white, as + suggested by F. Bicarri. + - removed the pdflatex option when loading hyperref to enable other engines + (e.g., dvips, xetex), leftover from the v 0.11 cleanup, as reported by + K. Amaterasu and P. Mavrogiorgos (launchpad bugs #754693 and #859834). + - added a "purple" color option, as proposed by B. Ravel. + - added a 3rd optional argument to the \photo command to control the thickness + of the framebox. Setting it to 0pt will disable the frame around the photo, as + requested by T. Krennwallner (launchpad bug #664568). + +version 0.12.0 (03 August 2010) + - prevented pagebreaks after sections and subsections (launchpad bug #409902), + as originally reported by C. Gaspoz and fixed by launchpad user tentotwo). + +version 0.11.0 (20 July 2010) + - removed the \ifpdf check when loading the graphicx package, as graphicx does + does check internally and this was preventing proper functionning with xelatex + and luatex, as reported by A. Trautmann. The same check was also removed + everywhere else in the document (i.e. when loading the color and hyperref + packages). + +version 0.10.0 (13 June 2010) + - fixed a compatibility issue with the natbib package (natbib uses \section* + to format the bibliography title, while only \section was defined by + moderncv), as reported on launchpad (launchpad bug #393920). + - fixed a compatibility issues with (any package relying on) the etoolbox + package, due to the double definition of \AtEndPreamble, as reported by + D. Becker. + +version 0.9.0 (31 May 2010) + - added support for the itemize, enumerate and description environments. + +version 0.8.0 (24 May 2010) + - added support for multibib. Also modified the template to illustrate how to + show labels in the bibliography, as requested by Tom D. R. and Stefan K. + - added a command to indicate your personal homepage (\homepage{url}), as + requested by J. de Jong and A. Pairet. + - corrected an alignment bug for text following a \quote with no immediate + \section, as kindly reported by J. Vermeulen and L. Saliou. + - corrected a spacing bug when no blank line (or \par) is left after + \maketitle. Thanks to A. Menzel for reporting the strange behaviour. + - corrected the alignment of the extrainfo title part when no picture was + used, as reported by M. Bana. + - corrected the missplacement of pdf bookmarks as noticed by L. Fortunato. + - corrected several bugs linked to the code for checking for empty arguments + in \cventry, as reported by B. Ekran (launchpad bug #268768), L. Păncescu and + E. Gregorio. + +version 0.7.0 (17 June 2008) + - corrected an outstanding spacing bug (space between cvlines longer + than 1 line). + - removed the need to use \closesection and \emptysection as internal + tabulars are now always closed. This allows she use of bibliography packages + such as bibunits. Thanks to S. Busch for pointing out the incompatibility and + helping testing out the bug correction. + - changed the definition of \photo: the first (optional) argument should + give the desired width of the picture, instead of its height + - corrected an alignment bug for \cvlistitems longer than 1 line, as + reported by S. Nikolopoulos. + - deprecated the commands \sethintscolumnlength and \sethintscolumntowidth. + Instead, just set \hintscolumnwidth to the desired length by using the regular + \setlength or \settowidth commands, and call \recomputelengths. + - added the ability to control the width of the name placeholder in the + classic theme, by setting the length \maketitlenamewidth. Again, don't forget + to call \recomputelengths afterward. + +version 0.6.0 (28 May 2007) + - corrected some spacing bugs and cleaned up the code. + - corrected a bug in the bibliography file of the examples spotted by + U. Stöhr. + - added color variants to the classic and casual style, as suggested by + U. Stöhr. + - added a page counter for resumes running longer than 1 page, as requested by + A. Martin. It can be disabled by the command \nopagenumbers{}. + - added commands to include a mobile phone and fax number. + - made the symbols used for the phone number, the email, ... customizable. + To modify those symbols, just redefine \phonesymbol, emailsymbol, ... + - corrected the pdf information given to hyperref as pointed out by + C. Knuepfer. + - rewrote the examples. + +version 0.5.0 (9 September 2006) + - added a \photo command to display a picture. That command takes the name of + the file with the picture as argument, and the desired height as optional + argument. + - implemented the needed commands to make moderncv compatible with BibTeX, as + suggested by J. Lie. This makes it possible to display one's publications, + stored in the BibTeX file 'publications.bib' + by using: + \nocite{*} + \bibliographystyle{plain} + \bibliography{publications} + As usual, the name of the section title can be changed by redefining the + command \refname. + - added the \today command, useful for example if one need to add the date the + resumé was produced with + \closesection{} + \vfill{\hfill{\scriptsize Produced \today.}} + at the end of your CV, as suggested by F. Hammann. + +version 0.4.0 (2 May 2006) + - removed the dependency on the geometry package, so that users can now invoke + it themselve, and easily change the geometry of the page. + +version 0.3.0 (10 April 2006) + - moderncv now uses the 'longtable' class, allowing cv sections to split + across multiple pages. + - the different lengths used by moderncv are now customizable! In particular, + the first column (the one containing the date in the examples), can now be set + to any width, for people needing a smaller or larger one. To do that, either + use + \sethintscolumnlength{<length>}, + where <length> is the desired length in a unit LaTeX understands, or + \sethintscolumntowidth{<string>}, + where <string> is a string of the desired length (usually, the longest string + that has to appear in the column). Thanks to A. Pöge for pointing out the need + of such a feature. + - added the command \emptysection{}, which makes it possible to start a + section without name. In combination with \closesection{}, this makes it + possible to drop out of the layout of moderncv, and come back to it later. + This should make the inclusion of arbitrary elements not covered by moderncv + code possible. + - corrected a spacing problem in the cventry command, as pointed out and + solved by B. Eßmann. + +version 0.2.0 (6 March 2006) + - rewrite of the code to have the styles (fonts, colours, headers and footers) + be defined in different files than the class. The styles are now defined in a + separate file per style, named moderncvstyle<style_name>. It should now be + easy to write your own style, starting from moderncvstyleempty.sty. If you + feel you have created a nice style, just email it to me and I'll include it in + the next version. + - due to the previous point, styles are now loaded by the command + \moderncvstyle{style_name}. I couldn't figure out a way to preserve the old + "casual" and "classic" class options, so these are now broken! Use + \moderncvstyle{casual} or \moderncvstyle{classic} at the beginning of your + document. This should be the only incompatibility with version 0.1. + - added class option "nolmodern" for people without the latin modern fonts. + - corrected some English mistakes in the examples. Thanks to M. H. Prager for + pointing them out. + - added a \cvlistitem to produce items with a bullet (or whatever is defined + in \listitemsymbol), and renamed \cvresume to \cvlistdoubleitem for + consistency purpose. For compatibility reasons, the command \cvresume still + works, but should be avoided. + +version 0.1.0 (1 March 2006) + - first release. diff --git a/public/lib/templates/template7/inputs/KNOWN_BUGS b/public/lib/templates/template7/inputs/KNOWN_BUGS new file mode 100644 index 00000000..15b86ecc --- /dev/null +++ b/public/lib/templates/template7/inputs/KNOWN_BUGS @@ -0,0 +1,15 @@ +- When using the "fancy" style, undesired space is added between the bibliography + head and the first entry, as well as after the last entry +- Moderncv is incompatible with biblatex. +- Footnotes generates errors (though the output seem correct when running with + "-interaction=nonstopmode") +- When using CJK, the last \clearpage required for fancyhdr to work properly kills + the "lastpage" counter, hence also the page numbering. +- Moderncv produces an error ("lonely \item--perhaps a missing list environment") + when used with bibentry, through the output is actually correct. Amongst other, + this causes compilation by LyX to stop. +- The space after a cventry gets eaten up when the last argument contains a nested + itemize environment. An ugly hack and incomplete solution was implemented by + including a \strut in every item label, but this doesn't solve the problem for + multi-line items. Ideally, the strut should end the item, but there seems to be + no way to do this. diff --git a/public/lib/templates/template7/inputs/LICENSE.txt b/public/lib/templates/template7/inputs/LICENSE.txt new file mode 100644 index 00000000..f8b699e6 --- /dev/null +++ b/public/lib/templates/template7/inputs/LICENSE.txt @@ -0,0 +1,415 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.3c 2008-05-04 + +Copyright 1999 2002-2008 LaTeX3 Project + Everyone is allowed to distribute verbatim copies of this + license document, but modification of it is not allowed. + + +PREAMBLE +======== + +The LaTeX Project Public License (LPPL) is the primary license under +which the LaTeX kernel and the base LaTeX packages are distributed. + +You may use this license for any work of which you hold the copyright +and which you wish to distribute. This license may be particularly +suitable if your work is TeX-related (such as a LaTeX package), but +it is written in such a way that you can use it even if your work is +unrelated to TeX. + +The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE', +below, gives instructions, examples, and recommendations for authors +who are considering distributing their works under this license. + +This license gives conditions under which a work may be distributed +and modified, as well as conditions under which modified versions of +that work may be distributed. + +We, the LaTeX3 Project, believe that the conditions below give you +the freedom to make and distribute modified versions of your work +that conform with whatever technical specifications you wish while +maintaining the availability, integrity, and reliability of +that work. If you do not see how to achieve your goal while +meeting these conditions, then read the document `cfgguide.tex' +and `modguide.tex' in the base LaTeX distribution for suggestions. + + +DEFINITIONS +=========== + +In this license document the following terms are used: + + `Work' + Any work being distributed under this License. + + `Derived Work' + Any work that under any applicable law is derived from the Work. + + `Modification' + Any procedure that produces a Derived Work under any applicable + law -- for example, the production of a file containing an + original file associated with the Work or a significant portion of + such a file, either verbatim or with modifications and/or + translated into another language. + + `Modify' + To apply any procedure that produces a Derived Work under any + applicable law. + + `Distribution' + Making copies of the Work available from one person to another, in + whole or in part. Distribution includes (but is not limited to) + making any electronic components of the Work accessible by + file transfer protocols such as FTP or HTTP or by shared file + systems such as Sun's Network File System (NFS). + + `Compiled Work' + A version of the Work that has been processed into a form where it + is directly usable on a computer system. This processing may + include using installation facilities provided by the Work, + transformations of the Work, copying of components of the Work, or + other activities. Note that modification of any installation + facilities provided by the Work constitutes modification of the Work. + + `Current Maintainer' + A person or persons nominated as such within the Work. If there is + no such explicit nomination then it is the `Copyright Holder' under + any applicable law. + + `Base Interpreter' + A program or process that is normally needed for running or + interpreting a part or the whole of the Work. + + A Base Interpreter may depend on external components but these + are not considered part of the Base Interpreter provided that each + external component clearly identifies itself whenever it is used + interactively. Unless explicitly specified when applying the + license to the Work, the only applicable Base Interpreter is a + `LaTeX-Format' or in the case of files belonging to the + `LaTeX-format' a program implementing the `TeX language'. + + + +CONDITIONS ON DISTRIBUTION AND MODIFICATION +=========================================== + +1. Activities other than distribution and/or modification of the Work +are not covered by this license; they are outside its scope. In +particular, the act of running the Work is not restricted and no +requirements are made concerning any offers of support for the Work. + +2. You may distribute a complete, unmodified copy of the Work as you +received it. Distribution of only part of the Work is considered +modification of the Work, and no right to distribute such a Derived +Work may be assumed under the terms of this clause. + +3. You may distribute a Compiled Work that has been generated from a +complete, unmodified copy of the Work as distributed under Clause 2 +above, as long as that Compiled Work is distributed in such a way that +the recipients may install the Compiled Work on their system exactly +as it would have been installed if they generated a Compiled Work +directly from the Work. + +4. If you are the Current Maintainer of the Work, you may, without +restriction, modify the Work, thus creating a Derived Work. You may +also distribute the Derived Work without restriction, including +Compiled Works generated from the Derived Work. Derived Works +distributed in this manner by the Current Maintainer are considered to +be updated versions of the Work. + +5. If you are not the Current Maintainer of the Work, you may modify +your copy of the Work, thus creating a Derived Work based on the Work, +and compile this Derived Work, thus creating a Compiled Work based on +the Derived Work. + +6. If you are not the Current Maintainer of the Work, you may +distribute a Derived Work provided the following conditions are met +for every component of the Work unless that component clearly states +in the copyright notice that it is exempt from that condition. Only +the Current Maintainer is allowed to add such statements of exemption +to a component of the Work. + + a. If a component of this Derived Work can be a direct replacement + for a component of the Work when that component is used with the + Base Interpreter, then, wherever this component of the Work + identifies itself to the user when used interactively with that + Base Interpreter, the replacement component of this Derived Work + clearly and unambiguously identifies itself as a modified version + of this component to the user when used interactively with that + Base Interpreter. + + b. Every component of the Derived Work contains prominent notices + detailing the nature of the changes to that component, or a + prominent reference to another file that is distributed as part + of the Derived Work and that contains a complete and accurate log + of the changes. + + c. No information in the Derived Work implies that any persons, + including (but not limited to) the authors of the original version + of the Work, provide any support, including (but not limited to) + the reporting and handling of errors, to recipients of the + Derived Work unless those persons have stated explicitly that + they do provide such support for the Derived Work. + + d. You distribute at least one of the following with the Derived Work: + + 1. A complete, unmodified copy of the Work; + if your distribution of a modified component is made by + offering access to copy the modified component from a + designated place, then offering equivalent access to copy + the Work from the same or some similar place meets this + condition, even though third parties are not compelled to + copy the Work along with the modified component; + + 2. Information that is sufficient to obtain a complete, + unmodified copy of the Work. + +7. If you are not the Current Maintainer of the Work, you may +distribute a Compiled Work generated from a Derived Work, as long as +the Derived Work is distributed to all recipients of the Compiled +Work, and as long as the conditions of Clause 6, above, are met with +regard to the Derived Work. + +8. The conditions above are not intended to prohibit, and hence do not +apply to, the modification, by any method, of any component so that it +becomes identical to an updated version of that component of the Work as +it is distributed by the Current Maintainer under Clause 4, above. + +9. Distribution of the Work or any Derived Work in an alternative +format, where the Work or that Derived Work (in whole or in part) is +then produced by applying some process to that format, does not relax or +nullify any sections of this license as they pertain to the results of +applying that process. + +10. a. A Derived Work may be distributed under a different license + provided that license itself honors the conditions listed in + Clause 6 above, in regard to the Work, though it does not have + to honor the rest of the conditions in this license. + + b. If a Derived Work is distributed under a different license, that + Derived Work must provide sufficient documentation as part of + itself to allow each recipient of that Derived Work to honor the + restrictions in Clause 6 above, concerning changes from the Work. + +11. This license places no restrictions on works that are unrelated to +the Work, nor does this license place any restrictions on aggregating +such works with the Work by any means. + +12. Nothing in this license is intended to, or may be used to, prevent +complete compliance by all parties with all applicable laws. + + +NO WARRANTY +=========== + +There is no warranty for the Work. Except when otherwise stated in +writing, the Copyright Holder provides the Work `as is', without +warranty of any kind, either expressed or implied, including, but not +limited to, the implied warranties of merchantability and fitness for a +particular purpose. The entire risk as to the quality and performance +of the Work is with you. Should the Work prove defective, you assume +the cost of all necessary servicing, repair, or correction. + +In no event unless required by applicable law or agreed to in writing +will The Copyright Holder, or any author named in the components of the +Work, or any other party who may distribute and/or modify the Work as +permitted above, be liable to you for damages, including any general, +special, incidental or consequential damages arising out of any use of +the Work or out of inability to use the Work (including, but not limited +to, loss of data, data being rendered inaccurate, or losses sustained by +anyone as a result of any failure of the Work to operate with any other +programs), even if the Copyright Holder or said author or said other +party has been advised of the possibility of such damages. + + +MAINTENANCE OF THE WORK +======================= + +The Work has the status `author-maintained' if the Copyright Holder +explicitly and prominently states near the primary copyright notice in +the Work that the Work can only be maintained by the Copyright Holder +or simply that it is `author-maintained'. + +The Work has the status `maintained' if there is a Current Maintainer +who has indicated in the Work that they are willing to receive error +reports for the Work (for example, by supplying a valid e-mail +address). It is not required for the Current Maintainer to acknowledge +or act upon these error reports. + +The Work changes from status `maintained' to `unmaintained' if there +is no Current Maintainer, or the person stated to be Current +Maintainer of the work cannot be reached through the indicated means +of communication for a period of six months, and there are no other +significant signs of active maintenance. + +You can become the Current Maintainer of the Work by agreement with +any existing Current Maintainer to take over this role. + +If the Work is unmaintained, you can become the Current Maintainer of +the Work through the following steps: + + 1. Make a reasonable attempt to trace the Current Maintainer (and + the Copyright Holder, if the two differ) through the means of + an Internet or similar search. + + 2. If this search is successful, then enquire whether the Work + is still maintained. + + a. If it is being maintained, then ask the Current Maintainer + to update their communication data within one month. + + b. If the search is unsuccessful or no action to resume active + maintenance is taken by the Current Maintainer, then announce + within the pertinent community your intention to take over + maintenance. (If the Work is a LaTeX work, this could be + done, for example, by posting to comp.text.tex.) + + 3a. If the Current Maintainer is reachable and agrees to pass + maintenance of the Work to you, then this takes effect + immediately upon announcement. + + b. If the Current Maintainer is not reachable and the Copyright + Holder agrees that maintenance of the Work be passed to you, + then this takes effect immediately upon announcement. + + 4. If you make an `intention announcement' as described in 2b. above + and after three months your intention is challenged neither by + the Current Maintainer nor by the Copyright Holder nor by other + people, then you may arrange for the Work to be changed so as + to name you as the (new) Current Maintainer. + + 5. If the previously unreachable Current Maintainer becomes + reachable once more within three months of a change completed + under the terms of 3b) or 4), then that Current Maintainer must + become or remain the Current Maintainer upon request provided + they then update their communication data within one month. + +A change in the Current Maintainer does not, of itself, alter the fact +that the Work is distributed under the LPPL license. + +If you become the Current Maintainer of the Work, you should +immediately provide, within the Work, a prominent and unambiguous +statement of your status as Current Maintainer. You should also +announce your new status to the same pertinent community as +in 2b) above. + + +WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE +====================================================== + +This section contains important instructions, examples, and +recommendations for authors who are considering distributing their +works under this license. These authors are addressed as `you' in +this section. + +Choosing This License or Another License +---------------------------------------- + +If for any part of your work you want or need to use *distribution* +conditions that differ significantly from those in this license, then +do not refer to this license anywhere in your work but, instead, +distribute your work under a different license. You may use the text +of this license as a model for your own license, but your license +should not refer to the LPPL or otherwise give the impression that +your work is distributed under the LPPL. + +The document `modguide.tex' in the base LaTeX distribution explains +the motivation behind the conditions of this license. It explains, +for example, why distributing LaTeX under the GNU General Public +License (GPL) was considered inappropriate. Even if your work is +unrelated to LaTeX, the discussion in `modguide.tex' may still be +relevant, and authors intending to distribute their works under any +license are encouraged to read it. + +A Recommendation on Modification Without Distribution +----------------------------------------------------- + +It is wise never to modify a component of the Work, even for your own +personal use, without also meeting the above conditions for +distributing the modified component. While you might intend that such +modifications will never be distributed, often this will happen by +accident -- you may forget that you have modified that component; or +it may not occur to you when allowing others to access the modified +version that you are thus distributing it and violating the conditions +of this license in ways that could have legal implications and, worse, +cause problems for the community. It is therefore usually in your +best interest to keep your copy of the Work identical with the public +one. Many works provide ways to control the behavior of that work +without altering any of its licensed components. + +How to Use This License +----------------------- + +To use this license, place in each of the components of your work both +an explicit copyright notice including your name and the year the work +was authored and/or last substantially modified. Include also a +statement that the distribution and/or modification of that +component is constrained by the conditions in this license. + +Here is an example of such a notice and statement: + + %% pig.dtx + %% Copyright 2005 M. Y. Name + % + % This work may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.3 + % of this license or (at your option) any later version. + % The latest version of this license is in + % http://www.latex-project.org/lppl.txt + % and version 1.3 or later is part of all distributions of LaTeX + % version 2005/12/01 or later. + % + % This work has the LPPL maintenance status `maintained'. + % + % The Current Maintainer of this work is M. Y. Name. + % + % This work consists of the files pig.dtx and pig.ins + % and the derived file pig.sty. + +Given such a notice and statement in a file, the conditions +given in this license document would apply, with the `Work' referring +to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being +generated from `pig.dtx' using `pig.ins'), the `Base Interpreter' +referring to any `LaTeX-Format', and both `Copyright Holder' and +`Current Maintainer' referring to the person `M. Y. Name'. + +If you do not want the Maintenance section of LPPL to apply to your +Work, change `maintained' above into `author-maintained'. +However, we recommend that you use `maintained', as the Maintenance +section was added in order to ensure that your Work remains useful to +the community even when you can no longer maintain and support it +yourself. + +Derived Works That Are Not Replacements +--------------------------------------- + +Several clauses of the LPPL specify means to provide reliability and +stability for the user community. They therefore concern themselves +with the case that a Derived Work is intended to be used as a +(compatible or incompatible) replacement of the original Work. If +this is not the case (e.g., if a few lines of code are reused for a +completely different task), then clauses 6b and 6d shall not apply. + + +Important Recommendations +------------------------- + + Defining What Constitutes the Work + + The LPPL requires that distributions of the Work contain all the + files of the Work. It is therefore important that you provide a + way for the licensee to determine which files constitute the Work. + This could, for example, be achieved by explicitly listing all the + files of the Work near the copyright notice of each file or by + using a line such as: + + % This work consists of all files listed in manifest.txt. + + in that place. In the absence of an unequivocal list it might be + impossible for the licensee to determine what is considered by you + to comprise the Work and, in such a case, the licensee would be + entitled to make reasonable conjectures as to which files comprise + the Work. diff --git a/public/lib/templates/template7/inputs/README.md b/public/lib/templates/template7/inputs/README.md new file mode 100644 index 00000000..9b661a6c --- /dev/null +++ b/public/lib/templates/template7/inputs/README.md @@ -0,0 +1,29 @@ +# moderncv + +## A modern curriculum vitae class for LaTeX + +**moderncv** provides a documentclass for typesetting curricula vitae in various styles. Moderncv aims to be both straightforward to use and customizable, providing five ready-made styles (classic, casual, banking, oldstyle and fancy) and allowing one to define his own by modifying colors, fonts, icons, etc. + +Most commands are defined in such a way that arguments are optional. + +Until a decent manual is written, one can always look in the `template.tex` file for an example. It can be compiled to pdf via `latexmk -pdf ./template.tex`. + +If using [`academicons`](https://ctan.org/tex-archive/fonts/academicons) in the template, you need to use a Xe(La)TeX or Lua(La)TeX engine for them to render. Otherwise an alternative will be used automatically. + +## Development + +[![Build template](https://github.com/moderncv/moderncv/actions/workflows/build-pdf.yml/badge.svg)](https://github.com/moderncv/moderncv/actions/workflows/build-pdf.yml) +[![CTAN](https://img.shields.io/ctan/v/moderncv.svg)](https://www.ctan.org/pkg/moderncv) +[![Matrix](https://img.shields.io/matrix/moderncv:matrix.org)](https://matrix.to/#/#moderncv:matrix.org) + +As the main goal is to keep this package alive, it is maintained in a loosely structured team. You can contact us in our matrix room [moderncv:matrix.org](https://matrix.to/#/#moderncv:matrix.org), feel free to join if you have questions or want to contribute. Development takes places at [github.com/moderncv/moderncv](https://github.com/moderncv/moderncv). + +## Licence + +moderncv is licensed under the [LPPL-1.3c](https://spdx.org/licenses/LPPL-1.3c.html). + +## Origin + +Original author: Xavier Danaux <xdanaux@gmail.com><br/> +Original repository: https://github.com/xdanaux/moderncv<br/> +This repository is a fork aiming to maintain moderncv inside CTAN, since upstream is dead since 2016. diff --git a/public/lib/templates/template7/inputs/manual/moderncv_userguide.pdf b/public/lib/templates/template7/inputs/manual/moderncv_userguide.pdf new file mode 100644 index 00000000..cadbefe3 Binary files /dev/null and b/public/lib/templates/template7/inputs/manual/moderncv_userguide.pdf differ diff --git a/public/lib/templates/template7/inputs/manual/moderncv_userguide.tex b/public/lib/templates/template7/inputs/manual/moderncv_userguide.tex new file mode 100644 index 00000000..26d20161 --- /dev/null +++ b/public/lib/templates/template7/inputs/manual/moderncv_userguide.tex @@ -0,0 +1,462 @@ +%% moderncv_userguide.tex (compiled with pdfLaTeX) +%% Copyright 2007 Cristina Sambo +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + +\documentclass[a4paper,11pt]{article} + +\title{\bfseries Moderncv -- v. 0.6} +\author{Package by Xavier Danaux \\ \begin{small}Documentation by Cristina Sambo \end{small}} +\date{} + +%language and encoding options +\usepackage[english]{babel} +\usepackage[T1]{fontenc} +\usepackage[latin1]{inputenc} + +%font options +\usepackage{txfonts} +\usepackage{marvosym} +\usepackage{pifont} + +%margins, spacing and page layout +\usepackage[pdftex,colorlinks=true]{hyperref} %(hyperref must be loaded before geometry) +\usepackage[pdftex]{geometry} +\geometry{top=2.5cm, bottom=3cm} +\setlength{\parindent}{0pt} %(to soppress indentation when starting a new paragraph) +\frenchspacing %(to soppress additional space after a full stop) + +%packages +\usepackage[pdftex]{graphicx} +\usepackage[pdftex]{xcolor} +\usepackage[labelfont=sl,font=small,width=0.9\textwidth]{caption} +\usepackage{marvosym} +\usepackage{latexsym} + +%pdfLaTeX options +\pdfpagewidth=\paperwidth +\pdfpageheight=\paperheight +\pdfimageresolution=150 +\pdfinfo{ + /Title (Moderncv -- v. 0.6) + /Author (Cristina Sambo) + /Subject (Moderncv package user's guide) + /Keywords (curriculum vitae, LaTeX) +} + +%my commands +\definecolor{bluecv}{rgb}{0.25,0.5,0.75} +\definecolor{greencv}{rgb}{0.55,0.85,0.35} +\definecolor{redcv}{rgb}{1.00,0.30,0.30} +\definecolor{orangecv}{rgb}{1,0.65,0.20} +\definecolor{greycv}{rgb}{0.75,0.75,0.75} + +%================== +% DOCUMENT BEGINNING +%================== +\begin{document} +\maketitle + +\begin{abstract} +\noindent \texttt{Moderncv}, as its author says in the readme file, provides a documentclass for typesetting modern curriculum vitaes in various styles. It is fairly customizable, allowing you to define your own style by changing the colors, the fonts, \dots\ and provides two default styles: classic and casual. +\end{abstract} + +\section{Introduction} +When I saw for the first time this class I was amazing: ``Here it is what I need'', I thought. Using the very clear examples, was easy to make my first curriculum. +Indeed the class is very simple to use, in this documentation I will only put together all the things to help users to have all on hand. + +\smallskip +\texttt{Moderncv} requires the following packages: \texttt{ifthen}, \texttt{ifpdf}, \texttt{color}, \texttt{lmodern}, \texttt{marvosym}, \texttt{url}, \texttt{hyperref}, \texttt{longtable}, \texttt{graphicx}, \texttt{fancyhdr}, usually all just included in the \LaTeX\ distributions. + +\section{In the preamble} + +At the very beginning of your preamble (that is the part before \verb|\begin{document}|) insert: + +\begin{verbatim} +\documentclass[<options>]{moderncv} +\end{verbatim} + +where the options are: + +\begin{description} + \item[paper size options:] \texttt{a4paper}, \texttt{a5paper}, \texttt{b5paper}, \texttt{letterpaper}, \texttt{legalpaper}, \texttt{ex\-ec\-u\-tive\-pa\-per}, \texttt{landscape} + \item[font size options:] \texttt{10pt}, \texttt{11pt}, \texttt{12pt} + \item[font option:] \texttt{nolmodern}, for people without the latin modern fonts + \item[color option:] \texttt{nocolor}, to have all in black and white + \item[draft/final options:] \texttt{draft}, \texttt{final} +\end{description} + +The default options are: \texttt{a4paper}, \texttt{11pt}, \texttt{color}, \texttt{final}. + +After the documentclass specification, choose the theme for your curriculum vit\ae: + +\begin{verbatim} +\moderncvtheme[<options>]{casual} +\end{verbatim} + +which is the default theme, or + +\begin{verbatim} +\moderncvtheme[<options>]{classic} +\end{verbatim} + +where the theme options are: + +\begin{description} + \item[color options:] you can choose between five color: + \begin{itemize} + \item[\texttt{blue}] {\color{bluecv}\rule{1cm}{2ex}} (default color) + \item[\texttt{green}] {\color{greencv}\rule{1cm}{2ex}} + \item[\texttt{red}] {\color{redcv}\rule{1cm}{2ex}} + \item[\texttt{orange}] {\color{orangecv}\rule{1cm}{2ex}} + \item[\texttt{grey}] {\color{greycv}\rule{1cm}{2ex}} + \end{itemize} + \item[roman option:] \texttt{roman}, for {\fontsize{11}{12} \usefont{T1}{lmr}{m}{n}\selectfont roman} fonts, instead of \fontsize{11}{12} \usefont{T1}{lmss}{m}{n}\selectfont sans serif fonts. +\end{description} + +Then you have to specify the character encoding (utf8, latin1, and so on): + +\begin{verbatim} +\usepackage[<your encoding>]{inputenc} +\end{verbatim} + +and you can adjust the page geometry: + +\begin{verbatim} +\usepackage[<options>]{geometry} +\recomputelengths +\end{verbatim} + +where \verb|\recomputelengths| is required when changes are made to page layout lengths. + +Now we can get into the part most related to our curriculum vit\ae: our personal data. They will be inserted in the header of the first page, in the classic theme, or in the footer of every page, in the case of casual theme. + +\begin{itemize} +\item \verb|\firstname{John}| +\item \verb|\familyname{Doe}| +\item \verb|\title{Resum\'e title}|: optional +\item \verb|\address{street and number}{postcode city}|: optional +\item \verb|\mobile{mobile}|: optional +\item \verb|\phone{phone}|: optional +\item \verb|\fax{fax}|: optional +\item \verb|\email{email}|: optional +\item \verb|\extrainfo{additional information}|: optional; here you can put, for example, the address of your website +\item \verb|\photo[64pt]{picture}|: optional; \texttt{64pt} is the height the picture, you can set here the size you prefer; \texttt{picture} is the name of the picture file +\item \verb|\quote{Some quote}|: optional +\end{itemize} + +Finally you can suppress automatic page numbering for CVs longer than one page: + +\begin{verbatim} +\nopagenumbers{} +\end{verbatim} + +\subsection{Examples} + +In practice, you will type: + +\begin{verbatim} +\documentclass[11pt,a4paper]{moderncv} + +% moderncv themes +\moderncvtheme[green]{casual} + +% character encoding +\usepackage[utf8]{inputenc} + +% adjust the page margins +\usepackage[scale=0.8]{geometry} +\recomputelengths + +% personal data +\firstname{John} +\familyname{Doe} +\title{Design enthusiast} +\address{12 somestreet}{3456 somecity} +\mobile{+123 456 7890} +\phone{+12 (3)456 78 90} +\fax{+12 (3)456 78 90} +\email{jdoe@design.org} +\extrainfo{\weblink{www.ctan.org}} +\photo[64pt]{jdoe_picture} +\quote{Any intelligent fool can make things bigger, more complex, +and more violent. It takes a touch of genius -- and a lot of courage -- to +move in the opposite direction.} + +\begin{document} +\maketitle + +... <what you'll see in the next section> + +\end{document} +\end{verbatim} + +to obtain a casual moderncv in green, as shown in figure \ref{fig:casual}, and you will substitute the line describing the theme with: + +\begin{verbatim} +% moderncv themes +\moderncvtheme[blue]{classic} +\end{verbatim} + +to obtain a classic moderncv in blue, as shown in figure \ref{fig:classic}. + + +\begin{figure}[p] + \centering + \fbox{\includegraphics[angle=90,width=\textwidth]{cv_casual.pdf}} + \caption{An example of casual moderncv in green.} + \label{fig:casual} +\end{figure} + +\begin{figure}[p] + \centering + \fbox{\includegraphics[angle=90,width=\textwidth]{cv_classic.pdf}} + \caption{An example of classic moderncv in blue.} + \label{fig:classic} +\end{figure} + +\section{Customize sections} + +Now we are ready to edit the part between \verb|\begin{document}| and \verb|\end{document}|. + +As you can seen in figure \ref{fig:casual} e \ref{fig:classic}, you can divide your CV into sections, each of them describing what you are, what you know and what you have done in your life. Every section is divide into items chosen from different flavours. More in details: + +\subsection{Section} + +The command to open a new section is: + +\begin{verbatim} +\section{<title>} +\end{verbatim} + +and every section can be divided into subsections: + +\begin{verbatim} +\subsection{<title>} +\end{verbatim} + +If necessary, there is a command to close the section: + +\begin{verbatim} +\closesection{} +\end{verbatim} + +and even one to create an empty section: + +\begin{verbatim} +\emptysection{} +\end{verbatim} + +An example of their usage can be the next one: + +\begin{verbatim} +\section{Section with your own content}\closesection +Your content here, inside the normal \LaTeX{} environment. +You can use any regular \LaTeX{} command, display mathematics +\[e =m\,c^2,\] +put some table or figure, \dots + +\emptysection{} +\cvitem{Now}{Back to moderncv layout, without making a new section :-)} +\end{verbatim} + +whose results is shown in figure \ref{fig:ex_sec}. + +\begin{figure}[!ht] + \centering + \fbox{\includegraphics[width=0.9\textwidth]{ex_sec}} + \caption{Example of usage of section commands.} + \label{fig:ex_sec} +\end{figure} + +\subsection{Items} + +Inside sections, you can choose between different kind of items depending on the purpose: + +\begin{itemize} + \item in the sections describing your education or your job experiences, you can use: + \begin{verbatim} +\cventry{years}{degree/job title}{institution/employer} +{localization}{optional: grade/...} +{optional: comment/job description} + \end{verbatim} +\vspace{-20pt} +where the last three arguments are optional + \item inside `language' cvsection environment, you can type every entry with: + \begin{verbatim} +\cvlanguage{name}{level}{comment} + \end{verbatim} + \item inside `computer skills' cvsection environment, you can type every entry with: + \begin{verbatim} +\cvcomputer{category}{programs}{category}{programs} + \end{verbatim} + \item to typeset lines with a hint on the left: + \begin{verbatim} +\cvline{leftmark}{text} + \end{verbatim} + \item to typeset entry with a description on the left, but in two columns inside a cvsection: + \begin{verbatim} +\cvdoubleitem{subtitle}{text}{subtitle}{text} + \end{verbatim} + \item to typeset lists on one column inside a cvsection: + \begin{verbatim} +\cvlistitem{point1} + \end{verbatim} + \item to typeset lists on two columns inside a cvsection: + \begin{verbatim} +\cvlistdoubleitem{point1}{point2} + \end{verbatim} + \item to add a section listing all your publications stored in a BibTeX file: + \begin{verbatim} +\nocite{*} +\bibliographystyle{plain} +\bibliography{BibTeX_file} + \end{verbatim} +\vspace{-20pt} + where the name of the section title can be changed by redefining the \texttt{refname} with \verb|\renewcommand{\refname}{<new_name>}| +\end{itemize} + +\subsubsection*{Example} + +Let's put all together and see in figure \ref{fig:sections} what is the result: + +\begin{verbatim} +... preamble ... +\begin{document} +\section{Education} +\cventry{year--year}{Degree}{Institution}{City}{\textit{Grade}}{Description} +\cventry{year--year}{Degree}{Institution}{City}{\textit{Grade}}{Description} +% +\section{Master thesis} +\cvline{title}{\emph{Title}} +\cvline{supervisors}{Supervisors} +\cvline{description}{\small Short thesis abstract} +% +\section{Experience} +\subsection{Vocational} +\cventry{year--year}{Job title}{Employer}{City}{}{Description} +\cventry{year--year}{Job title}{Employer}{City}{}{Description} +\subsection{Miscellaneous} +\cventry{year--year}{Job title}{Employer}{City}{}% + {Description line 1\newline{}Description line 2} +% +\section{Languages} +\cvlanguage{language 1}{Skill level}{Comment} +\cvlanguage{language 2}{Skill level}{Comment} +% +\section{Computer skills} +\cvcomputer{category 1}{XXX, YYY, ZZZ}{category 3}{XXX, YYY, ZZZ} +\cvcomputer{category 2}{XXX, YYY, ZZZ}{category 4}{XXX, YYY, ZZZ} +% +\section{Interests} +\cvline{hobby 1}{\small Description} +\cvline{hobby 2}{\small Description} +\cvline{hobby 3}{\small Description} +% +\closesection{} +\pagebreak +% +\section{Extra} +\cvlistitem{Item 1} +\cvlistitem{Item 2} +\cvlistitem{Item 3} +% +\section{Extra 2} +\cvlistdoubleitem{Item 1}{Item 4} +\cvlistdoubleitem{Item 2}{Item 5} +\cvlistdoubleitem{Item 3}{} +% +% Publications from a BibTeX file +\nocite{*} +\bibliographystyle{plain} +\bibliography{publications} % 'publications' is the name of a BibTeX file +% +\end{document} +\end{verbatim} + +\begin{figure}[!ht] + \centering + \fbox{\includegraphics[angle=90,width=\textwidth]{test_cvsection2.pdf}}\\ + \fbox{\includegraphics[angle=90,width=\textwidth]{test_cvsection1.pdf}} +\caption{Example of usage of items inside cvsections.} + \label{fig:sections} +\end{figure} + +\section{More customizations} + +You have some useful commands to personalize your CV further. + +\subsection*{Modifying the symbols} +You can modify the symbols used for the personal data (phone number, the email, \ldots) redefining \texttt{phonesymbol}, \texttt{emailsymbol}, \texttt{addresssymbol}, \texttt{mobilesymbol}, \texttt{faxsymbol}. + +For example: if you want to use the dingbat fonts, load the \texttt{pifont} package in the preamble, then substitute the default symbol \Telefon\ with the dingbat symbol \ding{38}\ by: +\begin{verbatim} +\renewcommand{\phonesymbol}{\ding{38}} +\end{verbatim} + +You can change the symbol for lists in two way: +\begin{itemize} + \item redefining the command \texttt{listitemsymbol}: \verb|\renewcommand{\listitemsymbol}{-}| + \item adding a specification for the label in \texttt{cvlistitem} and \texttt{cvlistdoubleitem} +\end{itemize} + +For example: the following code produces the result shown in figure \ref{fig:ex_items}. + +\begin{verbatim} +\closesection{} % needed to renewcommands +\renewcommand{\listitemsymbol}{-} % change the symbol for lists + +\section{Extra 1} +\cvlistitem{Item 1} +\cvlistitem{Item 2} +\cvlistitem[+]{Item 3} % optional other symbol + +\section{Extra 2} +\cvlistdoubleitem[\Neutral]{Item 1}{Item 4} +\cvlistdoubleitem[\Neutral]{Item 2}{Item 5} +\cvlistdoubleitem[\Neutral]{Item 3}{} +\end{verbatim} + +\begin{figure}[!hbt] + \centering + \fbox{\includegraphics[width=.8\textwidth]{ex_items.png}} + \caption{Example of customization of the list labels.} + \label{fig:ex_items} +\end{figure} + +\subsection*{Adjusting lenghts} +The different lengths used by moderncv are customizable by +\begin{verbatim} +\setlength{<length>}{<new_dimensions>} +\end{verbatim} +where \texttt{<length>} are \texttt{quote\-width}, \texttt{sep\-a\-ra\-tor\-col\-umn\-width}, \texttt{main\-col\-umn\-width}, \texttt{doub\-le\-i\-tem\-main\-col\-umn\-width}, \texttt{list\-i\-tem\-sym\-bol\-width}, \texttt{list\-doub\-le\-i\-tem\-main\-col\-umn\-width}, + +In particular, the first column, can be set to any width. You can do that in two way: +\begin{itemize} + \item using \verb|\sethintscolumnlength{<length>}|, where \texttt{<length>} is the desired length in a unit LaTeX understands + \item using \verb|\sethintscolumntowidth{<string>}|, where \texttt{<string>} is a string of the desired length (usually, the longest string that has to appear in the column) +\end{itemize} + +\subsection*{Additional commands} +There are commands to manage hypertextual links: +\begin{itemize} + \item[-] \verb|\weblink[optional text]{link}| + \item[-] \verb|\httplink[optional text]{link}| + \item[-] \verb|\emaillink[optional text]{link}| +\end{itemize} + +There is a \verb|\today| command, useful for example if you need to add the date the CV was produced. + +\subsection*{Putting things at the end of CV} +Sometimes there is the need to add some lines at the end of the CV. For example, in Italy is necessary to add the permission to treat the personal data contained in the r\'esum\'e. You can do that dropping out of the layout of \texttt{moderncv} and pushing the lines at the end by the command \verb|\vfill|: +\begin{verbatim} +\emptysection{}\closesection +\vfill +\begin{center} +\textit{\small Ai sensi del D. Lgs. 196/2003 ...} +\end{center} +\end{verbatim} + +\end{document} diff --git a/public/lib/templates/template7/inputs/moderncv.cls b/public/lib/templates/template7/inputs/moderncv.cls new file mode 100644 index 00000000..44b9e359 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncv.cls @@ -0,0 +1,747 @@ +%% start of file `moderncv.cls'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{moderncv}[2022-02-21 v2.3.1 modern curriculum vitae and letter document class] + + +%------------------------------------------------------------------------------- +% class options +% +% (need to be done before the external package loading, for example because +% we need \paperwidth, \paperheight and \@ptsize to be defined before loading +% geometry and fancyhdr) +%------------------------------------------------------------------------------- +% paper size option +\DeclareOption{a4paper}{ + \setlength\paperheight{297mm} + \setlength\paperwidth{210mm}} +\DeclareOption{a5paper}{ + \setlength\paperheight{210mm} + \setlength\paperwidth{148mm}} +\DeclareOption{b5paper}{ + \setlength\paperheight{250mm} + \setlength\paperwidth{176mm}} +\DeclareOption{letterpaper}{ + \setlength\paperheight{11in} + \setlength\paperwidth{8.5in}} +\DeclareOption{legalpaper}{ + \setlength\paperheight{14in} + \setlength\paperwidth{8.5in}} +\DeclareOption{executivepaper}{ + \setlength\paperheight{10.5in} + \setlength\paperwidth{7.25in}} +\DeclareOption{landscape}{ + \setlength\@tempdima{\paperheight} + \setlength\paperheight{\paperwidth} + \setlength\paperwidth{\@tempdima}} + +% font size options +\newcommand\@ptsize{} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{11pt}{\renewcommand\@ptsize{1}} +\DeclareOption{12pt}{\renewcommand\@ptsize{2}} + +% font type options +\DeclareOption{sans}{\AtBeginDocument{\renewcommand{\familydefault}{\sfdefault}}} +\DeclareOption{roman}{\AtBeginDocument{\renewcommand{\familydefault}{\rmdefault}}} + +% draft/final option +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} + +% execute default options +\ExecuteOptions{a4paper,11pt,final} + +% process given options +\ProcessOptions\relax +\input{size1\@ptsize.clo} + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +% \AtEndPreamble hook (loading etoolbox instead of defining the macro, as to avoid incompatibilities with etoolbox (and packages relying on it) defining the macro too) +\RequirePackage{etoolbox} +%\let\@endpreamblehook\@empty +%\def\AtEndPreamble{\g@addto@macro\@endpreamblehook} +%\let\document@original\document +%\def\document{\endgroup\@endpreamblehook\begingroup\document@original} + +% if... then... else... constructs +\RequirePackage{ifthen} +% TODO: move to xifthen and \isempty{<arg>} instead of \equal{<arg>}{} + +% color +\RequirePackage[table]{xcolor} + +% tex compiler checking for symbol loading +\RequirePackage{iftex} +\newif\ifxetexorluatex +\ifxetex + \xetexorluatextrue +\else + \ifluatex + \xetexorluatextrue + \else + \xetexorluatexfalse + \fi +\fi + + +% hyper links (hyperref is loaded at the end of the preamble to pass options required by loaded packages such as CJK) +\newcommand*\pdfpagemode{UseNone}% do not show thumbnails or bookmarks on opening (on supporting browsers); set \pdfpagemode to "UseOutlines" to show bookmarks +\RequirePackage{url} +\urlstyle{tt} +\AtEndPreamble{ + \pagenumbering{arabic}% has to be issued before loading hyperref, as to set \thepage and hence to avoid hyperref issuing a warning and setting pdfpagelabels=false + \RequirePackage[unicode]{hyperref}% unicode is required for unicode pdf metadata + \hypersetup{ + breaklinks, + pdfborder = 0 0 0, + pdfpagemode = \pdfpagemode, + pdfstartpage = 1, + pdfcreator = {\LaTeX{} with 'moderncv' package}, +% pdfproducer = {\LaTeX{}},% will/should be set automatically to the correct TeX engine used + bookmarksopen = true, + bookmarksdepth= 2,% to show sections and subsections + pdfauthor = {\@firstname{}~\@lastname{}}, + pdftitle = {\@firstname{}~\@lastname{}\notblank{\@title}{ -- \@title}{}}, + pdfsubject = {R\'{e}sum\'{e} of \@firstname{}~\@lastname{}}, + pdfkeywords = {\@firstname{}~\@lastname{}, curriculum vit\ae{}, r\'{e}sum\'{e}}}} + +% graphics +\RequirePackage{graphicx} + +% headers and footers +\RequirePackage{fancyhdr} +\fancypagestyle{plain}{ + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{0pt} + \fancyhf{}} +% page numbers in footer if more than 1 page +\newif\if@displaypagenumbers\@displaypagenumberstrue +\newcommand*{\nopagenumbers}{\@displaypagenumbersfalse} +\AtEndPreamble{% + \AtBeginDocument{% + % fancyhdr length + \renewcommand{\headwidth}{\textwidth} + \if@displaypagenumbers% + \@ifundefined{r@lastpage}{}{% + \ifthenelse{\pageref{lastpage}>1}{% + \newlength{\pagenumberwidth}% + \settowidth{\pagenumberwidth}{\color{color2}\addressfont\itshape\strut\thepage/\pageref{lastpage}}% + \fancypagestyle{plain}{% + \fancyfoot[r]{\parbox[b]{\pagenumberwidth}{\color{color2}\pagenumberfont\strut\thepage/\pageref{lastpage}}}}% the parbox is required to ensure alignment with a possible center footer (e.g., as in the casual style) + \pagestyle{plain}}{}}\fi}% + \AtEndDocument{\label{lastpage}}} +\pagestyle{plain} + +% reduced list spacing +% package providing hooks into lists +% originally developped by Jakob Schiotz (see http://dcwww.camd.dtu.dk/~schiotz/comp/LatexTips/tweaklist.sty) +% modified and distributed with moderncv(not available otherwise on ctan) +\RequirePackage{tweaklist} +\renewcommand*{\itemhook}{% + \@minipagetrue% removes spacing before lists as they use \addvspace, which doesn't add vertical space inside minipages + \@noparlisttrue% removes spacing at end of lists, caused by \par + \setlength{\topsep}{0pt}% normally not required thanks to \@minipagetrue + \setlength{\partopsep}{0pt}% normally not required thanks to \@minipagetrue + \setlength{\parsep}{0pt}% not required when \itemsep and \parskip are set to 0pt (?) + \setlength{\parskip}{0pt}% + \setlength{\itemsep}{0pt}} +\renewcommand*{\enumhook}{\itemhook{}} +\renewcommand*{\deschook}{\itemhook{}} + +% lengths calculations +\RequirePackage{calc} + +% advanced command arguments (LaTeX 3) +\RequirePackage{xparse} +% TODO (?): replace all \newcommand by \NewDocumentCommand + +% micro-typography (e.g., character protrusion, font expansion, hyphenatable letterspacing) +\RequirePackage{microtype} + +% stack of key-value elements, used to save personal information +\RequirePackage{moderncvcollection} + +% compatibility package with older versions of moderncv +\RequirePackageWithOptions{moderncvcompatibility} + +\RequirePackage{expl3} + +%------------------------------------------------------------------------------- +% class definition +%------------------------------------------------------------------------------- +% minimal base settings +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength{\parindent}{0\p@} +\setlength{\parskip}{0\p@} +\setlength\columnsep{10\p@} +\setlength\columnseprule{0\p@} +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} + +% not set on purpose +%\setlength\arraycolsep{5\p@} +%\setlength\tabcolsep{6\p@} +%\setlength\tabbingsep{\labelsep} + +\raggedbottom +\onecolumn + + +%------------------------------------------------------------------------------- +% overall design commands definitions +%------------------------------------------------------------------------------- +% elements +%--------- +% defines one's name +% usage: \name{<firstname>}{<lastname>} +\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}} + +% defines one's title (optional) +% usage: \title{<title>} +\renewcommand*{\title}[1]{\def\@title{#1}} + +% defines one's address (optional) +% usage: \address{<street>}{<city>}{<country>} +% where the <city> and <country> arguments can be omitted or provided empty +\NewDocumentCommand{\address}{mG{}G{}}{\def\@addressstreet{#1}\def\@addresscity{#2}\def\@addresscountry{#3}} + +% defines one's birthday (optional) +% usage: \born{date, place} +\newcommand*{\born}[1]{\def\@born{#1}} + +% defines one's email (optional) +% usage: \email{<email adress>} +\newcommand*{\email}[1]{\def\@email{#1}} + +% defines one's home page (optional) +% usage: \homepage{<url>} +\newcommand*{\homepage}[1]{\def\@homepage{#1}} + +% adds a fixed/mobile/fax number to one's personal information (optional) +% usage: \phone[<optional type>]{<number>} +% where <optional type> should be either "fixed" (default), "mobile" or "fax +\collectionnew{phones} +\NewDocumentCommand{\phone}{O{fixed}m}{% + \ifthenelse{\equal{#1}{fax}}% + {\collectionadd[#1]{phones}{#2}} + {\collectionadd[#1]{phones}{\protect\tellink{#2}}} + } + + +% http://latex.org/forum/viewtopic.php?t=12239 +\def\SplitMyMacro#1/#2{#2} + + +% adds a social link to one's personal information (optional) +% usage: \social[<optional type>][<optional url>]{<account name>} +% where <optional type> should be either "linkedin", "xing", "twitter", "github", "gitlab", "bitbucket" or "skype" +\collectionnew{socials} +\NewDocumentCommand{\social}{O{}O{}m}{% + \ifthenelse{\equal{#2}{}}% + {% + \ifthenelse{\equal{#1}{linkedin}} {\collectionadd[linkedin]{socials} {\protect\httpslink[#3]{www.linkedin.com/in/#3}}} {}% + \ifthenelse{\equal{#1}{xing}} {\collectionadd[xing]{socials} {\protect\httpslink[#3]{www.xing.com/profile/#3}}} {}% + \ifthenelse{\equal{#1}{twitter}} {\collectionadd[twitter]{socials} {\protect\httpslink[#3]{twitter.com/#3}}} {}% + \ifthenelse{\equal{#1}{github}} {\collectionadd[github]{socials} {\protect\httpslink[#3]{github.com/#3}}} {}% + \ifthenelse{\equal{#1}{gitlab}} {\collectionadd[gitlab]{socials} {\protect\httpslink[#3]{gitlab.com/#3}}} {}% + \ifthenelse{\equal{#1}{stackoverflow}}{\collectionadd[stackoverflow]{socials}{\protect\httpslink[#3]{stackoverflow.com/users/#3}}} {}% + \ifthenelse{\equal{#1}{bitbucket}} {\collectionadd[bitbucket]{socials} {\protect\httpslink[#3]{bitbucket.org/#3}}} {}% + \ifthenelse{\equal{#1}{skype}} {\collectionadd[skype]{socials} {#3}} {}% + \ifthenelse{\equal{#1}{orcid}} {\collectionadd[orcid]{socials} {\protect\httpslink[#3]{orcid.org/#3}}} {}% + \ifthenelse{\equal{#1}{researchgate}} {\collectionadd[researchgate]{socials} {\protect\httpslink[#3]{www.researchgate.net/profile/#3}}} {}% + \ifthenelse{\equal{#1}{researcherid}} {\collectionadd[researcherid]{socials} {\protect\httpslink[#3]{www.researcherid.com/rid/#3}}} {}% + \ifthenelse{\equal{#1}{telegram}} {\collectionadd[telegram]{socials} {\protect\httpslink[#3]{t.me/#3}}} {}% + \ifthenelse{\equal{#1}{whatsapp}} {\collectionadd[whatsapp]{socials} {\protect\httpslink[#3]{wa.me/#3}}} {}% + \ifthenelse{\equal{#1}{signal}} {\collectionadd[signal]{socials} {#3}} {}% + \ifthenelse{\equal{#1}{matrix}} {\collectionadd[matrix]{socials} {\httpslink[#3]{matrix.to/\#/#3}}} {}% + \ifthenelse{\equal{#1}{googlescholar}}{\collectionadd[googlescholar]{socials}{\protect\httpslink[#3]{scholar.google.com/citations?user=#3}}} {}% {}% + } + {\collectionadd[#1]{socials}{\protect\httpslink[#3]{#2}}}}% + +% defines additional personal information (optional) +% usage: \extrainfo{<text>} +\newcommand*{\extrainfo}[1]{\def\@extrainfo{#1}} + +% colors +%------- +\definecolor{color0}{rgb}{0,0,0}% main default color, normally left to black +\definecolor{color1}{rgb}{0,0,0}% primary scheme color +\definecolor{color2}{rgb}{0,0,0}% secondary scheme color +\definecolor{color3}{rgb}{0,0,0}% tertiary scheme color + +% symbols +%-------- +% itemize labels (the struts were added to correct inter-item spacing (works for single line items, until a solution is found for multi-line ones...) +\newcommand*{\labelitemi} {\strut\textcolor{color1}{\large\rmfamily\textbullet}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n +\newcommand*{\labelitemii} {\strut\textcolor{color1}{\large\bfseries-}} +\newcommand*{\labelitemiii} {\strut\textcolor{color1}{\rmfamily\textperiodcentered}}% alternative: \textasteriskcentered; the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n +\newcommand*{\labelitemiv} {\labelitemiii} + +% enumerate labels +\renewcommand{\theenumi} {\@arabic\c@enumi} +\renewcommand{\theenumii} {\@alph\c@enumii} +\renewcommand{\theenumiii} {\@roman\c@enumiii} +\renewcommand{\theenumiv} {\@Alph\c@enumiv} + +% other symbols +\newcommand*{\listitemsymbol} {\labelitemi~} +\newcommand*{\addresssymbol} {} +\newcommand*{\bornsymbol} {} +\newcommand*{\mobilephonesymbol} {} +\newcommand*{\fixedphonesymbol} {} +\newcommand*{\faxphonesymbol} {} +\newcommand*{\emailsymbol} {} +\newcommand*{\homepagesymbol} {} +\newcommand*{\linkedinsocialsymbol} {} +\newcommand*{\xingsocialsymbol} {} +\newcommand*{\twittersocialsymbol} {} +\newcommand*{\githubsocialsymbol} {} +\newcommand*{\gitlabsocialsymbol} {} +\newcommand*{\stackoverflowsocialsymbol}{} +\newcommand*{\bitbucketsocialsymbol} {} +\newcommand*{\skypesocialsymbol} {} +\newcommand*{\orcidsocialsymbol} {} +\newcommand*{\researchgatesocialsymbol} {} +\newcommand*{\researcheridsocialsymbol} {} +\newcommand*{\googlescholarsocialsymbol}{} +\newcommand*{\telegramsocialsymbol} {} +\newcommand*{\whatsappsocialsymbol} {} +\newcommand*{\matrixsocialsymbol} {} +\newcommand*{\signalsocialsymbol} {} + +% other +%------ +% fonts +\AtBeginDocument{\normalfont\color{color0}} + +% strings for internationalisation +\newcommand*{\refname}{Publications} +\newcommand*{\enclname}{Enclosure} + +% makes the footer (normally used both for the resume and the letter) +% usage: \makefooter +\newcommand*{\makefooter}{}% + +\newcommand*{\@loadmoderncvpackage}[3][]{% + \begingroup\edef\x{\endgroup% + \noexpand\RequirePackage[#1]{moderncv#2\ifcase#3\or i\or ii\or iii\or iv\or v\or vi\or vii\or viii\or ix\or x\fi}% + }\x} + +% loads a style variant (a combination of header, body and footer) +% usage: \moderncvstyle{<style variant name>} +\newcommand*{\moderncvstyle}[2][]{% + \RequirePackage[#1]{moderncvstyle#2}} + +% loads a header variant +% usage: \moderncvhead[<optional head option>]{<header variant number>} +\newcommand*{\moderncvhead}[2][]{% + \@loadmoderncvpackage[#1]{head}{#2}} + +% loads a body variant +% usage: \moderncvbody[<optional body option>]{<body variant number>} +\newcommand*{\moderncvbody}[2][]{% + \@loadmoderncvpackage[#1]{body}{#2}} + +% loads a footer variant +% usage: \moderncvfoot[<optional foot option>]{<foot variant number>} +\newcommand*{\moderncvfoot}[2][]{% + \@loadmoderncvpackage[#1]{foot}{#2}} + +% loads a color scheme +% usage: \moderncvcolor{<color scheme name>} +\newcommand*{\moderncvcolor}[1]{% + \RequirePackage{moderncvcolor#1}} + +% loads an icons set +% usage: \moderncvicons{<icon set name>} +\newcommand*{\moderncvicons}[1]{% + \RequirePackage{moderncvicons#1}} + +% recomputes all automatic lengths +\newcommand*{\recomputeheadlengths}{\recomputecvheadlengths} +\newcommand*{\recomputebodylengths}{\recomputecvbodylengths} +\newcommand*{\recomputefootlengths}{\recomputecvfootlengths} +\newcommand*{\recomputelengths}{\recomputecvlengths} +\AtBeginDocument{\recomputelengths{}} + +% creates a command if not yet defined +\newcommand*{\@initializecommand}[2]{% + \ifdefined#1 + \renewcommand{#1}{#2}% + \else% + \newcommand*{#1}{#2}\fi} + +% creates a length if not yet defined +\newcommand*{\@initializelength}[1]{% + \ifdefined#1 + \else% + \newlength{#1}\fi% + \setlength{#1}{0pt}} + +% creates a box if not yet defined +\newcommand*{\@initializebox}[1]{% + \ifdefined#1 + \savebox{#1}{}% + \else% + \newsavebox{#1}\fi} + +% creates an if switch if not yet defined +\newcommand*{\@initializeif}[1]{% +% \ifdefined#1% not working due to the nested \if +% \else% + \newif#1%\fi + } + +% custom strut for spacing; the first argument is the vertical offset of the strut, the second its total height +\newcommand*{\@moderncvstrut}[2]{% + \rule[-#1]{0pt}{#2}} + + +%------------------------------------------------------------------------------- +% resume design commands definitions +%------------------------------------------------------------------------------- +% elements +% defines one's picture (optional) +% usage: photo[<picture width>][<picture frame thickness>]{<picture filename>} +\NewDocumentCommand{\photo}{O{64pt}O{0.4pt}m}{\def\@photowidth{#1}\def\@photoframewidth{#2}\def\@photo{#3}} +\newcommand*{\quote}[1]{\def\@quote{#1}} + +% fonts +\newcommand*{\namefont}{} +\newcommand*{\titlefont}{} +\newcommand*{\addressfont}{} +\newcommand*{\quotefont}{} +\newcommand*{\sectionfont}{} +\newcommand*{\subsectionfont}{} +\newcommand*{\hintfont}{} +\newcommand*{\pagenumberfont}{\addressfont\itshape} +% fake small caps - cfr http://tex.stackexchange.com/questions/55664/fake-small-caps-with-xetex-fontspec +%\def\fakesc{\bgroup\obeyspaces\fakescaux} +%\def\fakescaux#1{\fakescauxii #1\relax\relax\egroup} +%\def\fakescauxii#1{% +%\ifx\relax#1\else \ifcat#1\@sptoken{} \expandafter\expandafter\expandafter\fakescauxii\else +%\ifnum`#1=\uccode`#1 {\normalsize #1}\else {\footnotesize \uppercase{#1}}\fi \expandafter\expandafter\expandafter\fakescauxii\expandafter\fi\fi} + +% styles +\newcommand*{\namestyle}[1]{{\namefont#1}} +\newcommand*{\titlestyle}[1]{{\titlefont#1}} +\newcommand*{\addressstyle}[1]{{\addressfont#1}} +\newcommand*{\quotestyle}[1]{{\quotefont#1}} +\newcommand*{\sectionstyle}[1]{{\sectionfont#1}} +\newcommand*{\subsectionstyle}[1]{{\subsectionfont#1}} +\newcommand*{\hintstyle}[1]{{\hintfont#1}} +\newcommand*{\pagenumberstyle}[1]{{\pagenumberfont#1}} + +% recompute all resume lengths +\newcommand*{\recomputecvheadlengths}{} +\newcommand*{\recomputecvbodylengths}{} +\newcommand*{\recomputecvfootlengths}{} +\newcommand*{\recomputecvlengths}{% + \recomputecvheadlengths% + \recomputecvbodylengths% + \recomputecvfootlengths} + +% internal maketitle command to issue a new line only when required +\newif\if@firstdetailselement\@firstdetailselementtrue +\newcommand*{\makenewline}[1][0pt]{% + \if@firstdetailselement% + \strut% to ensure baseline alignment, e.g. with when put in the margin vs sections that also contains a \strut + \else% + \\[#1]\fi% + \@firstdetailselementfalse} + +% makes the resume title +% usage: \makecvtitle +\newcommand*{\makecvtitle}{% + \makecvhead% + \makecvfoot} +\newcommand*{\makecvhead}{} +\newcommand*{\makecvfoot}{} + +% makes a resume section +% usage: \section{<title>} +% identical starred and non-starred variants should be defined for compatibility with other packages (e.g. with natbib, that uses \section*{} for the bibliography header) +\NewDocumentCommand{\section}{sm}{} + +% makes a resume subsection +% usage: \subsection{title} +\NewDocumentCommand{\subsection}{sm}{} + +% makes a resume line with a header and a corresponding text +% usage: \cvitem[spacing]{header}{text} +\newcommand*{\cvitem}[3][.25em]{} + +% makes a resume line 2 headers and their corresponding text +% usage: \cvdoubleitem[spacing]{header1}{text1}{header2}{text2} +\newcommand*{\cvdoubleitem}[5][.25em]{} + +% makes a resume line with a list item +% usage: \cvlistitem[label]{item} +\newcommand*{\cvlistitem}[2][\listitemsymbol]{} + +% makes a resume line with 2 list items +% usage: \cvlistdoubleitem[label]{item1}{item2} +\newcommand*{\cvlistdoubleitem}[3][\listitemsymbol]{} + +% makes a typical resume job / education entry +% usage: \cventry[spacing]{years}{degree/job title}{institution/employer}{localization}{optionnal: grade/...}{optional: comment/job description} +\newcommand*{\cventry}[7][.25em]{} + +% makes a resume entry with a proficiency comment +% usage: \cvitemwithcomment[spacing]{header}{text}{comment} +\newcommand*{\cvitemwithcomment}[4][.25em]{} + +% makes a generic hyperlink +% usage: \link[optional text]{link} +\newcommand*{\link}[2][]{% + \ifthenelse{\equal{#1}{}}% + {\href{#2}{#2}}% + {\href{#2}{#1}}} + +% makes a http hyperlink +% usage: \httplink[optional text]{link} +\newcommand*{\httplink}[2][]{% + \ifthenelse{\equal{#1}{}}% + {\href{http://#2}{#2}}% + {\href{http://#2}{#1}}} + + +% makes an https hyperlink +% usage: \httpslink[optional text]{link} +\newcommand*{\httpslink}[2][]{% + \ifthenelse{\equal{#1}{}}% + {\href{https://#2}{#2}}% + {\href{https://#2}{#1}}} + +% makes an email hyperlink +% usage: \emaillink[optional text]{link} +\newcommand*{\emaillink}[2][]{% + \ifthenelse{\equal{#1}{}}% + {\href{mailto:#2}{#2}}% + {\href{mailto:#2}{#1}}} + +% makes a tel hyperlink +% usage: \tellink[optional text]{link} +\newcommand*{\tellink}[2][]{% + \ifthenelse{\equal{#1}{}}% + {\expandafter\onlynumberslink\expandafter{#2}{#2}}% + {\expandafter\onlynumberslink\expandafter{#2}{#1}}} + +\ExplSyntaxOn +\tl_new:N \l_onlynumberslink_tl +\cs_new:Npn \onlynumberslink #1 #2 { + \tl_set:Nn \l_onlynumberslink_tl {#1} + \regex_replace_all:nnN {[^0-9+]} {} \l_onlynumberslink_tl + \href{ tel\token_to_str:N : \tl_use:N \l_onlynumberslink_tl}{ #2 } +} +\ExplSyntaxOff + +% cvcolumns environment, where every column is created through \cvcolumn +% usage: \begin{cvcolumns} +% \cvcolumn[width]{head}{content} +% \cvcolumn[width]{head}{content} +% ... +% \end{cvcolumns} +% where "width" is the width as a fraction of the line length (between 0 and 1), "head" is the column header and "content" its content +\newcounter{cvcolumnscounter}% counter for the number of columns +\newcounter{cvcolumnsautowidthcounter}% counter for the number of columns with no column width provided, and which will then be equally distributed +\newcounter{tmpiteratorcounter}% counter for any temporary purpose (e.g., iterating loops) +\newlength{\cvcolumnsdummywidth}\setlength{\cvcolumnsdummywidth}{1000pt}% dummy width for total width, in order to enable arithmetics (TeX has no float variables, only integer counters or lengths) +\newlength{\cvcolumnswidth}% total width available for head / content +\newlength{\cvcolumnsautowidth}% total width of columns with no explicit width provided +\newlength{\cvcolumnautowidth}% width of one of the columns with no explicit width provided (based on equal distribution of remaining space) +\newif\if@cvcolumns@head@empty% whether or not at least one of the columns has a header +\newenvironment*{cvcolumns}% + {% at environment opening: reset counters, lengths and ifs + \setcounter{cvcolumnscounter}{0}% + \setcounter{cvcolumnsautowidthcounter}{0}% + \setlength{\cvcolumnsautowidth}{\cvcolumnsdummywidth}% + \setlength{\cvcolumnautowidth}{0pt}% + \@cvcolumns@head@emptytrue\ignorespaces}% + {% at environment closing: typeset environment + % compute the width of each cvcolumn, considering a spacing of \separatorcolumnwidth and the columns with set width + \ifnum\thecvcolumnscounter>0% + \setlength{\cvcolumnswidth}{\maincolumnwidth-\value{cvcolumnscounter}\separatorcolumnwidth+\separatorcolumnwidth}% + \setlength{\cvcolumnautowidth}{\cvcolumnswidth*\ratio{\cvcolumnsautowidth}{\cvcolumnsdummywidth}/\value{cvcolumnsautowidthcounter}}\fi% + % pre-aggregate the tabular definition, heading and content (required before creating the tabular, as the tabular environment doesn't like loops --- probably because "&" generates a \endgroup) + % - the tabular definition is the aggregation of the different "\cvcolumn<i>@def" (by default "p{\cvcolumnautowidth}"), separated by "@{\hspace*{\separatorcolumnwidth}}" + % - the tabular heading is the aggregation of the different "\cvcolumn<i>@head", separated by "&" + % - the tabular content is the aggregation of the different "\cvcolumn<i>@content", separated by "&" + % to aggregate the different elements, \protected@edef or \g@addto@macro is required to avoid that \cvcolumns@def, -@head and -@content get expanded in subsequent redefinitions, which would cause errors due to the expansions of \hspace, of \subsectionstyle and possibly of user content/argument such as font commands + \def\cvcolumns@def{}% + \def\cvcolumns@head{}% + \def\cvcolumns@content{}% + \setcounter{tmpiteratorcounter}{0}% + % loop based on \g@addto@macro + \loop\ifnum\thetmpiteratorcounter<\thecvcolumnscounter% + \ifnum\thetmpiteratorcounter=0\else% + \g@addto@macro\cvcolumns@def{@{\hspace*{\separatorcolumnwidth}}}% + \g@addto@macro\cvcolumns@head{&}% + \g@addto@macro\cvcolumns@content{&}\fi% +% \expandafter\g@addto@macro\expandafter\cvcolumns@def\expandafter{\csname cvcolumn\roman{tmpiteratorcounter}@def\endcsname}% % this creates issues with the colortbl" package (loaded by xcolor when passing the "table" option) as the column definitions passed to \begin{tabular} contains \cvcolumn<i>@def references that it doesn't understand; the next 2 lines expand \cvcolumn@def to the point it doesn't + \edef\tmpcvcolumn@def{\csname cvcolumn\roman{tmpiteratorcounter}@def\endcsname}% + \expandafter\g@addto@macro\expandafter\cvcolumns@def\expandafter{\tmpcvcolumn@def}% + \expandafter\g@addto@macro\expandafter\cvcolumns@head\expandafter{\csname cvcolumn\roman{tmpiteratorcounter}@head\endcsname}% + \expandafter\g@addto@macro\expandafter\cvcolumns@content\expandafter{\csname cvcolumn\roman{tmpiteratorcounter}@content\endcsname}% + \stepcounter{tmpiteratorcounter}% + \repeat% +% % same loop based on \protected@edef +% \loop\ifnum\thetmpiteratorcounter<\thecvcolumnscounter% +% \ifnum\thetmpiteratorcounter=0\else% +% \protected@edef\cvcolumns@def{\cvcolumns@def @{\hspace*{\separatorcolumnwidth}}}% +% \protected@edef\cvcolumns@head{\cvcolumns@head &}% +% \protected@edef\cvcolumns@content{\cvcolumns@content &}\fi% +% \expandafter\protected@edef\expandafter\cvcolumns@def\expandafter{\expandafter\cvcolumns@def\expandafter\protect\csname cvcolumn\roman{tmpiteratorcounter}@def\endcsname}% +% \expandafter\protected@edef\expandafter\cvcolumns@head\expandafter{\expandafter\cvcolumns@head\expandafter\protect\csname cvcolumn\roman{tmpiteratorcounter}@head\endcsname}% +% \expandafter\protected@edef\expandafter\cvcolumns@content\expandafter{\expandafter\cvcolumns@content\expandafter\protect\csname cvcolumn\roman{tmpiteratorcounter}@content\endcsname}% +% \stepcounter{tmpiteratorcounter}% +% \repeat% + % create the tabular + \cvitem{}{% +% \begin{tabular}{\cvcolumns@def}% this conflicts with the "colortbl" package (loaded by xcolor when passing the "table" option), and requires the below 2 lines to expand \cvcolumns@def + \def\begincvcolumns{\begin{tabular}[t]}% "[t]" is required for some body styles; the default alignment is "[c]" + \expandafter\begincvcolumns\expandafter{\cvcolumns@def}% + \if@cvcolumns@head@empty\else% + \cvcolumns@head%\\[-.8em]% +% {\color{color1}\rule{\maincolumnwidth}{.25pt}}% + \\\fi% + \cvcolumns@content% + \end{tabular}}} + +% cvcolumn command, to create a column inside a cvcolumns environment +% usage: \cvcolumn[width]{head}{content} +% where "width" is the width as a fraction of the line length (between 0 and 1), "head" is the column header and "content" its content ("head" and "content" can contain "\\", "\newline" or any other paragraph command such as "itemize") +\newcommand*{\cvcolumn}[3][\cvcolumnautowidth]{% +% \def\cvcolumn@width{}% + \ifthenelse{\equal{#1}{\cvcolumnautowidth}}% + {% if no width fraction is provided, count this column as auto-adjusted and set its width to \cvcolumnsautowidth + \stepcounter{cvcolumnsautowidthcounter}% + \expandafter\expandafter\expandafter\def\expandafter\csname cvcolumn\roman{cvcolumnscounter}@def\endcsname{p{\cvcolumnautowidth}}% + \expandafter\expandafter\expandafter\def\expandafter\csname cvcolumn\roman{cvcolumnscounter}@head\endcsname{\protect\parbox[b]{\cvcolumnautowidth}{\protect\subsectionstyle{#2}}}}% + {% if a width is provided, set the width of the column to it and decrease the available space for auto-adjusted columns + \addtolength{\cvcolumnsautowidth}{-#1\cvcolumnsdummywidth}% + \expandafter\expandafter\expandafter\def\expandafter\csname cvcolumn\roman{cvcolumnscounter}@def\endcsname{p{#1\cvcolumnswidth}}% + \expandafter\expandafter\expandafter\def\expandafter\csname cvcolumn\roman{cvcolumnscounter}@head\endcsname{\protect\parbox[b]{#1\cvcolumnswidth}{\protect\subsectionstyle{#2}}}}% + \ifthenelse{\equal{#2}{}}{}{\@cvcolumns@head@emptyfalse}% + \expandafter\expandafter\expandafter\def\expandafter\csname cvcolumn\roman{cvcolumnscounter}@content\endcsname{\protect\cvcolumncell{#3}}% + \stepcounter{cvcolumnscounter}% + \ignorespaces} + +% internal cvcolumncell command, that enables a cvcolumn cell to contain paragraph commands (lists, newlines, etc) +\newcommand*{\cvcolumncell}[1]{{% put cell inside a group, so that command redefinitions are only local + % roughly restore \\ to its regular definition (outside of tabular) + \renewcommand*{\\}{\newline}% + % enclose the contents of the cell inside a vertical box, to allow paragraph commands + \protect\vtop{#1}}} + +% thebibliography environment, for use with BibTeX and possibly multibib +\newlength{\bibindent} +\setlength{\bibindent}{1.5em} +% bibliography item label +\newcommand*{\bibliographyitemlabel}{}% use \@biblabel{\arabic{enumiv}} for BibTeX labels +%\newif\if@multibibfirstbib\@multibibfirstbibfalse +% bibliography head (section, etc}, depending on whether multibib is used +\newcommand*{\bibliographyhead}[1]{\section{#1}} +\AtEndPreamble{\@ifpackageloaded{multibib}{\renewcommand*{\bibliographyhead}[1]{\subsection{#1}}}{}} +% thebibliography environment definition +\newenvironment{thebibliography}[1]{}{} +\newcommand*{\newblock}{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +%% fix a bug (hardcoded bib label) in \@bibitem +%\renewcommand\@bibitem[1]{% +% \item\if@filesw \immediate\write\@auxout +% {\string\bibcite{#1}{\theenumiv}}\fi\ignorespaces}% replaced "\the\value{\@listctr}" with "\theenumiv" + +% itemize, enumerate and description environment +\setlength{\leftmargini} {1em} +\leftmargin\leftmargini +\setlength{\leftmarginii} {\leftmargini} +\setlength{\leftmarginiii} {\leftmargini} +\setlength{\leftmarginiv} {\leftmargini} +\setlength{\leftmarginv} {\leftmargini} +\setlength{\leftmarginvi} {\leftmargini} +\setlength{\labelsep} {.5em}% this is the distance between the label and the body, but it pushes the label to the left rather than pushing the body to the right (to do the latter, modify \leftmargin(i) +\setlength{\labelwidth} {\leftmargini}% unfortunately, \labelwidth is not defined by item level (i.e. no \labeliwidth, \labeliiwidth, etc) +\addtolength{\labelwidth} {-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\p@enumii(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +% description label +\newcommand*\descriptionlabel[1]{\hspace\labelsep\normalfont\bfseries#1} + +% classical \today definition +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} + +%\newcommand{\widthofautobox}[1]{% +% \widthof{\begin{tabular}{@{}l@{}}#1\end{tabular}}} + +%\newcommand{\autobox}[2][b]{% +% \parbox[#1]{\widthofautobox{#2}}{#2}} + + +%------------------------------------------------------------------------------- +% letter design commands definitions +%------------------------------------------------------------------------------- +% elements +\newcommand*{\recipient}[2]{\def\@recipientname{#1}\def\@recipientaddress{#2}} +\renewcommand*{\date}[1]{\def\@date{#1}}\date{\today} +\newcommand*{\opening}[1]{\def\@opening{#1}} +\newcommand*{\closing}[1]{\def\@closing{#1}} +\newcommand*{\enclosure}[2][]{% + % if an optional argument is provided, use it to redefine \enclname + \ifthenelse{\equal{#1}{}}{}{\renewcommand*{\enclname}{#1}}% + \def\@enclosure{#2}} + +% recompute all letter lengths +\newcommand*{\recomputeletterheadlengths}{} +\newcommand*{\recomputeletterbodylengths}{} +\newcommand*{\recomputeletterfootlengths}{} +\newcommand*{\recomputeletterlengths}{% + \recomputeletterheadlengths% + \recomputeletterbodylengths% + \recomputeletterfootlengths} + +% makes the letter title +% usage: \makelettertitle +\newcommand*{\makelettertitle}{% + \makeletterhead% + \makeletterfoot} +\newcommand*{\makeletterhead}{} +\newcommand*{\makeletterfoot}{} + +% makes the letter closing +% usage: \makeletterclosing +\newcommand*{\makeletterclosing}{} + + +\endinput + + +%% end of file `moderncv.cls'. diff --git a/public/lib/templates/template7/inputs/moderncvbodyi.sty b/public/lib/templates/template7/inputs/moderncvbodyi.sty new file mode 100644 index 00000000..02ac2e3a --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvbodyi.sty @@ -0,0 +1,178 @@ +%% start of file `moderncvbodyi.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvbodyi}[2022-02-21 v2.3.1 modern curriculum vitae and letter body variant: 1] + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +% provides the commands for the skillmatrix as well as the command +% \recompute@cvskillmatrix@lengths +\RequirePackage[moderncvbodyi]{moderncvskillmatrix} + +%------------------------------------------------------------------------------- +% overall body definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\sectionfont}{\Large\mdseries\upshape} +\renewcommand*{\subsectionfont}{\large\mdseries\upshape} +\renewcommand*{\hintfont}{} + +% styles +\renewcommand*{\sectionstyle}[1]{{\sectionfont\textcolor{color1}{#1}}} +\renewcommand*{\subsectionstyle}[1]{{\subsectionfont\textcolor{color1}{#1}}} +\renewcommand*{\hintstyle}[1]{{\hintfont\textcolor{color0}{#1}}} + + +%------------------------------------------------------------------------------- +% resume body definition +%------------------------------------------------------------------------------- +% lengths +% used by \cvitem (and all children command) +\@initializelength{\hintscolumnwidth} \setlength{\hintscolumnwidth}{0.175\textwidth} +\@initializelength{\separatorcolumnwidth} \setlength{\separatorcolumnwidth}{0.025\textwidth} +\@initializelength{\maincolumnwidth} +% used by \cvdoubleitem +\@initializelength{\doubleitemcolumnwidth} +% used by \cvlistitem +\@initializelength{\listitemsymbolwidth} \settowidth{\listitemsymbolwidth}{\listitemsymbol} +\@initializelength{\listitemcolumnwidth} +% used by \cvlistdoubleitem +\@initializelength{\listdoubleitemcolumnwidth} +% default moderncv \photo (change the definition such that by default the photo and its box align with the section bars +\RenewDocumentCommand{\photo}{O{\hintscolumnwidth-0.8pt-2\fboxsep}O{0.4pt}m}{\def\@photowidth{#1}\def\@photoframewidth{#2}\def\@photo{#3}}% + +% commands +\renewcommand*{\recomputecvbodylengths}{% + % body lengths + \setlength{\maincolumnwidth}{\textwidth-\leftskip-\rightskip-\separatorcolumnwidth-\hintscolumnwidth}% + \setlength{\listitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth}% + \setlength{\doubleitemcolumnwidth}{\maincolumnwidth-\hintscolumnwidth-\separatorcolumnwidth-\separatorcolumnwidth}% + \setlength{\doubleitemcolumnwidth}{0.5\doubleitemcolumnwidth}% + \setlength{\listdoubleitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth-\separatorcolumnwidth-\listitemsymbolwidth}% + \setlength{\listdoubleitemcolumnwidth}{0.5\listdoubleitemcolumnwidth}% + \recompute@cvskillmatrix@lengths + % regular lengths + \setlength{\parskip}{0\p@}} + + +\@initializelength{\baseletterheight} +\settoheight{\baseletterheight}{\sectionstyle{o}} +\setlength{\baseletterheight}{\baseletterheight-0.95ex} +\RenewDocumentCommand{\section}{sm}{% + \par\addvspace{2.5ex}% + \phantomsection{}% reset the anchor for hyperrefs + \addcontentsline{toc}{section}{#2}% + \cvitem[0ex]{\strut\raggedleft\raisebox{\baseletterheight}{\color{color1}\rule{\hintscolumnwidth}{0.95ex}}}{\strut\sectionstyle{#2}}% + \par\nobreak\addvspace{1ex}\@afterheading}% to avoid a pagebreak after the heading + +\RenewDocumentCommand{\subsection}{sm}{% + \par\addvspace{1ex}% + \phantomsection{}% reset the anchor for hyperrefs + \addcontentsline{toc}{subsection}{#2}% + \cvitem[0ex]{}{\strut\subsectionstyle{#2}}% + \par\nobreak\addvspace{.5ex}\@afterheading}% to avoid a pagebreak after the heading + +\renewcommand*{\cvitem}[3][.25em]{% + \begin{tabular}{@{}p{\hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}p{\maincolumnwidth}@{}}% + \raggedleft\hintstyle{#2} &{#3}% + \end{tabular}% + \par\addvspace{#1}} + +\renewcommand*{\cvdoubleitem}[5][.25em]{% + \cvitem[#1]{#2}{% + \begin{minipage}[t]{\doubleitemcolumnwidth}#3\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \begin{minipage}[t]{\hintscolumnwidth}\raggedleft\hintstyle{#4}\end{minipage}% + \hspace*{\separatorcolumnwidth}% + \begin{minipage}[t]{\doubleitemcolumnwidth}#5\end{minipage}}} + +\renewcommand*{\cvlistitem}[2][.25em]{% + \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listitemcolumnwidth}#2\end{minipage}}} + +\renewcommand*{\cvlistdoubleitem}[3][.25em]{% + \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#2\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \ifthenelse{\equal{#3}{}}% + {}% + {\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#3\end{minipage}}}} + +\renewcommand*{\cventry}[7][.25em]{% + \cvitem[#1]{#2}{% + {\bfseries#3}% + \ifthenelse{\equal{#4}{}}{}{, {\slshape#4}}% + \ifthenelse{\equal{#5}{}}{}{, #5}% + \ifthenelse{\equal{#6}{}}{}{, #6}% + \strut% + \ifx&% + \else{\newline{}\begin{minipage}[t]{\linewidth}\small#7\end{minipage}}\fi}} + +\@initializebox{\cvitemwithcommentbox} +\@initializelength{\cvitemwithcommentskilllength} +\@initializelength{\cvitemwithcommentcommentlength} +\renewcommand*{\cvitemwithcomment}[4][.25em]{% + \savebox{\cvitemwithcommentbox}{{#3}}% + \setlength{\cvitemwithcommentskilllength}{\widthof{\usebox{\cvitemwithcommentbox}}}% + \setlength{\cvitemwithcommentcommentlength}{\maincolumnwidth-\separatorcolumnwidth-\cvitemwithcommentskilllength}% + \cvitem[#1]{#2}{% + \begin{minipage}[t]{\cvitemwithcommentskilllength}\usebox{\cvitemwithcommentbox}\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \begin{minipage}[t]{\cvitemwithcommentcommentlength}\raggedleft\small\itshape#4\end{minipage}}} + +\renewenvironment{thebibliography}[1]% + {% + \bibliographyhead{\refname}% +% \small% + \begin{list}{\bibliographyitemlabel}% + {% + \setlength{\topsep}{0pt}% + \setlength{\labelwidth}{\hintscolumnwidth}% + \setlength{\labelsep}{\separatorcolumnwidth}% + \leftmargin\labelwidth% + \advance\leftmargin\labelsep% + \@openbib@code% + \usecounter{enumiv}% + \let\p@enumiv\@empty% + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy% + \clubpenalty4000%\@clubpenalty \clubpenalty% + \widowpenalty4000% + \sfcode`\.\@m% + \sfcode `\=1000\relax}% + {% + \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}% + \end{list}} + + +%------------------------------------------------------------------------------- +% letter style definition +%------------------------------------------------------------------------------- +% commands +\renewcommand*{\recomputeletterbodylengths}{% + \recomputecvlengths% + \setlength{\parskip}{6\p@}} + +\renewcommand*{\makeletterclosing}{ + \@closing\\[3em]% + {\bfseries\@firstname~\@lastname}% + \ifthenelse{\isundefined{\@enclosure}}{}{% + \\% + \vfil% + {\color{color2}\itshape\enclname: \@enclosure}}% + \vfil} + + +\endinput + + +%% end of file `moderncvbodyi.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvbodyii.sty b/public/lib/templates/template7/inputs/moderncvbodyii.sty new file mode 100644 index 00000000..02ac2e3a --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvbodyii.sty @@ -0,0 +1,178 @@ +%% start of file `moderncvbodyi.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvbodyi}[2022-02-21 v2.3.1 modern curriculum vitae and letter body variant: 1] + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +% provides the commands for the skillmatrix as well as the command +% \recompute@cvskillmatrix@lengths +\RequirePackage[moderncvbodyi]{moderncvskillmatrix} + +%------------------------------------------------------------------------------- +% overall body definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\sectionfont}{\Large\mdseries\upshape} +\renewcommand*{\subsectionfont}{\large\mdseries\upshape} +\renewcommand*{\hintfont}{} + +% styles +\renewcommand*{\sectionstyle}[1]{{\sectionfont\textcolor{color1}{#1}}} +\renewcommand*{\subsectionstyle}[1]{{\subsectionfont\textcolor{color1}{#1}}} +\renewcommand*{\hintstyle}[1]{{\hintfont\textcolor{color0}{#1}}} + + +%------------------------------------------------------------------------------- +% resume body definition +%------------------------------------------------------------------------------- +% lengths +% used by \cvitem (and all children command) +\@initializelength{\hintscolumnwidth} \setlength{\hintscolumnwidth}{0.175\textwidth} +\@initializelength{\separatorcolumnwidth} \setlength{\separatorcolumnwidth}{0.025\textwidth} +\@initializelength{\maincolumnwidth} +% used by \cvdoubleitem +\@initializelength{\doubleitemcolumnwidth} +% used by \cvlistitem +\@initializelength{\listitemsymbolwidth} \settowidth{\listitemsymbolwidth}{\listitemsymbol} +\@initializelength{\listitemcolumnwidth} +% used by \cvlistdoubleitem +\@initializelength{\listdoubleitemcolumnwidth} +% default moderncv \photo (change the definition such that by default the photo and its box align with the section bars +\RenewDocumentCommand{\photo}{O{\hintscolumnwidth-0.8pt-2\fboxsep}O{0.4pt}m}{\def\@photowidth{#1}\def\@photoframewidth{#2}\def\@photo{#3}}% + +% commands +\renewcommand*{\recomputecvbodylengths}{% + % body lengths + \setlength{\maincolumnwidth}{\textwidth-\leftskip-\rightskip-\separatorcolumnwidth-\hintscolumnwidth}% + \setlength{\listitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth}% + \setlength{\doubleitemcolumnwidth}{\maincolumnwidth-\hintscolumnwidth-\separatorcolumnwidth-\separatorcolumnwidth}% + \setlength{\doubleitemcolumnwidth}{0.5\doubleitemcolumnwidth}% + \setlength{\listdoubleitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth-\separatorcolumnwidth-\listitemsymbolwidth}% + \setlength{\listdoubleitemcolumnwidth}{0.5\listdoubleitemcolumnwidth}% + \recompute@cvskillmatrix@lengths + % regular lengths + \setlength{\parskip}{0\p@}} + + +\@initializelength{\baseletterheight} +\settoheight{\baseletterheight}{\sectionstyle{o}} +\setlength{\baseletterheight}{\baseletterheight-0.95ex} +\RenewDocumentCommand{\section}{sm}{% + \par\addvspace{2.5ex}% + \phantomsection{}% reset the anchor for hyperrefs + \addcontentsline{toc}{section}{#2}% + \cvitem[0ex]{\strut\raggedleft\raisebox{\baseletterheight}{\color{color1}\rule{\hintscolumnwidth}{0.95ex}}}{\strut\sectionstyle{#2}}% + \par\nobreak\addvspace{1ex}\@afterheading}% to avoid a pagebreak after the heading + +\RenewDocumentCommand{\subsection}{sm}{% + \par\addvspace{1ex}% + \phantomsection{}% reset the anchor for hyperrefs + \addcontentsline{toc}{subsection}{#2}% + \cvitem[0ex]{}{\strut\subsectionstyle{#2}}% + \par\nobreak\addvspace{.5ex}\@afterheading}% to avoid a pagebreak after the heading + +\renewcommand*{\cvitem}[3][.25em]{% + \begin{tabular}{@{}p{\hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}p{\maincolumnwidth}@{}}% + \raggedleft\hintstyle{#2} &{#3}% + \end{tabular}% + \par\addvspace{#1}} + +\renewcommand*{\cvdoubleitem}[5][.25em]{% + \cvitem[#1]{#2}{% + \begin{minipage}[t]{\doubleitemcolumnwidth}#3\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \begin{minipage}[t]{\hintscolumnwidth}\raggedleft\hintstyle{#4}\end{minipage}% + \hspace*{\separatorcolumnwidth}% + \begin{minipage}[t]{\doubleitemcolumnwidth}#5\end{minipage}}} + +\renewcommand*{\cvlistitem}[2][.25em]{% + \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listitemcolumnwidth}#2\end{minipage}}} + +\renewcommand*{\cvlistdoubleitem}[3][.25em]{% + \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#2\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \ifthenelse{\equal{#3}{}}% + {}% + {\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#3\end{minipage}}}} + +\renewcommand*{\cventry}[7][.25em]{% + \cvitem[#1]{#2}{% + {\bfseries#3}% + \ifthenelse{\equal{#4}{}}{}{, {\slshape#4}}% + \ifthenelse{\equal{#5}{}}{}{, #5}% + \ifthenelse{\equal{#6}{}}{}{, #6}% + \strut% + \ifx&% + \else{\newline{}\begin{minipage}[t]{\linewidth}\small#7\end{minipage}}\fi}} + +\@initializebox{\cvitemwithcommentbox} +\@initializelength{\cvitemwithcommentskilllength} +\@initializelength{\cvitemwithcommentcommentlength} +\renewcommand*{\cvitemwithcomment}[4][.25em]{% + \savebox{\cvitemwithcommentbox}{{#3}}% + \setlength{\cvitemwithcommentskilllength}{\widthof{\usebox{\cvitemwithcommentbox}}}% + \setlength{\cvitemwithcommentcommentlength}{\maincolumnwidth-\separatorcolumnwidth-\cvitemwithcommentskilllength}% + \cvitem[#1]{#2}{% + \begin{minipage}[t]{\cvitemwithcommentskilllength}\usebox{\cvitemwithcommentbox}\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \begin{minipage}[t]{\cvitemwithcommentcommentlength}\raggedleft\small\itshape#4\end{minipage}}} + +\renewenvironment{thebibliography}[1]% + {% + \bibliographyhead{\refname}% +% \small% + \begin{list}{\bibliographyitemlabel}% + {% + \setlength{\topsep}{0pt}% + \setlength{\labelwidth}{\hintscolumnwidth}% + \setlength{\labelsep}{\separatorcolumnwidth}% + \leftmargin\labelwidth% + \advance\leftmargin\labelsep% + \@openbib@code% + \usecounter{enumiv}% + \let\p@enumiv\@empty% + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy% + \clubpenalty4000%\@clubpenalty \clubpenalty% + \widowpenalty4000% + \sfcode`\.\@m% + \sfcode `\=1000\relax}% + {% + \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}% + \end{list}} + + +%------------------------------------------------------------------------------- +% letter style definition +%------------------------------------------------------------------------------- +% commands +\renewcommand*{\recomputeletterbodylengths}{% + \recomputecvlengths% + \setlength{\parskip}{6\p@}} + +\renewcommand*{\makeletterclosing}{ + \@closing\\[3em]% + {\bfseries\@firstname~\@lastname}% + \ifthenelse{\isundefined{\@enclosure}}{}{% + \\% + \vfil% + {\color{color2}\itshape\enclname: \@enclosure}}% + \vfil} + + +\endinput + + +%% end of file `moderncvbodyi.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvbodyiii.sty b/public/lib/templates/template7/inputs/moderncvbodyiii.sty new file mode 100644 index 00000000..003f9f3e --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvbodyiii.sty @@ -0,0 +1,247 @@ +%% start of file `moderncvbodyiii.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvbodyiii}[2022-02-21 v2.3.1 modern curriculum vitae and letter body variant: 3] + +% rules type options: "fullrules", "shortrules", "mixedrules" (default) or "norules" +\@initializeif{\if@fullrules}\@fullrulesfalse +\DeclareOption{fullrules} {\@fullrulestrue\@shortrulesfalse\@mixedrulesfalse\@norulesfalse} +\@initializeif{\if@shortrules}\@shortrulesfalse +\DeclareOption{shortrules}{\@fullrulesfalse\@shortrulestrue\@mixedrulesfalse\@norulesfalse} +\@initializeif{\if@mixedrules}\@mixedrulesfalse +\DeclareOption{mixedrules}{\@fullrulesfalse\@shortrulesfalse\@mixedrulestrue\@norulesfalse} +\@initializeif{\if@norules}\@norulesfalse +\DeclareOption{norules} {\@fullrulesfalse\@shortrulesfalse\@mixedrulesfalse\@norulestrue} + +% section alignment options: "left" (default), "center" or "right" +\@initializeif{\if@left}\@leftfalse +\DeclareOption{left} {\@lefttrue\@centerfalse\@rightfalse} +\@initializeif{\if@center}\@centerfalse +\DeclareOption{center} {\@leftfalse\@centertrue\@rightfalse} +\@initializeif{\if@right}\@rightfalse +\DeclareOption{right} {\@leftfalse\@centerfalse\@righttrue} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{mixedrules,left} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +% provides the commands for the skillmatrix as well as the command +% \recompute@cvskillmatrix@lengths +\RequirePackage[moderncvbodyiii]{moderncvskillmatrix} + +%------------------------------------------------------------------------------- +% overall body definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\sectionfont}{% + \if@norules% + \Large\bfseries\scshape% + \else% + \Large\bfseries\upshape\fi} +\renewcommand*{\subsectionfont}{% + \if@norules% + \large\mdseries\itshape% + \else% + \large\upshape\fontseries{sb}\selectfont\fi} +\renewcommand*{\hintfont}{\bfseries} + +% styles +\renewcommand*{\sectionstyle}[1]{{% + \if@center\centering\else% + \if@right\raggedleft\fi\fi% + \sectionfont\textcolor{color1}{#1}% + \if@shortrules\else% + \par\fi}} +\renewcommand*{\subsectionstyle}[1]{{% + \if@center\centering\else% + \if@right\raggedleft\fi\fi% + \subsectionfont\textcolor{color1}{#1}% + \if@shortrules\else\if@mixedrules\else% + \par\fi\fi}} +\renewcommand*{\hintstyle}[1]{{\hintfont\textcolor{color0}{#1}}} + + +%------------------------------------------------------------------------------- +% resume body definition +%------------------------------------------------------------------------------- +% lengths +% used by \cvitem (and all children command) +\@initializelength{\hintscolumnwidth} \setlength{\hintscolumnwidth}{0.3\textwidth} +\@initializelength{\separatorcolumnwidth} \setlength{\separatorcolumnwidth}{0.025\textwidth} +\@initializelength{\maincolumnwidth} +% used by \cvdoubleitem +\@initializelength{\doubleitemcolumnwidth} +% used by \cvlistitem +\@initializelength{\listitemsymbolwidth} \settowidth{\listitemsymbolwidth}{\listitemsymbol} +\@initializelength{\listitemcolumnwidth} +% used by \cvlistdoubleitem +\@initializelength{\listdoubleitemcolumnwidth} + +% commands +\renewcommand*{\recomputecvbodylengths}{% + % body lengths + \setlength{\maincolumnwidth}{\textwidth-\leftskip-\rightskip}% + \setlength{\listitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth}% + \setlength{\doubleitemcolumnwidth}{\maincolumnwidth-\separatorcolumnwidth}% + \setlength{\doubleitemcolumnwidth}{0.5\doubleitemcolumnwidth}% + \setlength{\listdoubleitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth-\separatorcolumnwidth-\listitemsymbolwidth}% + \setlength{\listdoubleitemcolumnwidth}{0.5\listdoubleitemcolumnwidth}% + \recompute@cvskillmatrix@lengths + % regular lengths + \setlength{\parskip}{0\p@}} + +\RenewDocumentCommand{\section}{sm}{% + \par\addvspace{2.5ex}% + \phantomsection{}% reset the anchor for hyperrefs + \addcontentsline{toc}{section}{#2}% + \if@left\else\if@fullrules\else\if@mixedrules\else% + \sectionrule\fi\fi\fi% + \strut\sectionstyle{#2}% + \if@fullrules% + \sectionrule% + \else\if@mixedrules% + \sectionrule% + \else\if@right\else% + \sectionrule\fi\fi\fi% + \par\nobreak\addvspace{1ex}\@afterheading} + +\RenewDocumentCommand{\subsection}{sm}{% + \par\addvspace{1ex}% + \phantomsection{}% + \addcontentsline{toc}{subsection}{#2}% + \if@left\else\if@fullrules\else% + \subsectionrule\fi\fi% + \strut\subsectionstyle{#2}% + \if@fullrules% + \subsectionrule% + \else\if@right\else% + \subsectionrule\fi\fi% + \par\nobreak\addvspace{0.5ex}\@afterheading} + +\newcommand*{\sectionrule}{} +\newcommand*{\subsectionrule}{} +\if@fullrules% + \renewcommand*{\sectionrule}{\par\nobreak\vspace*{-.7\baselineskip}\leavevmode{\color{color1}\leaders\hbox{\rule{1pt}{0.4pt}}\hfill\kern0pt}} + \renewcommand*{\subsectionrule}{\par\nobreak\vspace*{-.7\baselineskip}\leavevmode{\color{color1}\xleaders\hbox to 0.35em{\scriptsize.}\hfill}}\fi% different subsectionrules will not be perfectly aligned, but remaining space at the end of the fill will be distributed evenly between leaders, so it will be barely visible} +\if@shortrules% + \renewcommand*{\sectionrule}{\leavevmode{\color{color1}\leaders\hbox{\rule{1pt}{0.4pt}}\hfill\kern0pt}} + \renewcommand*{\subsectionrule}{\leavevmode{\color{color1}\xleaders\hbox to 0.35em{\scriptsize.}\hfill}}\fi% different subsectionrules will not be perfectly aligned, but remaining space at the end of the fill will be distributed evenly between leaders, so it will be barely visible}} +\if@mixedrules% + \renewcommand*{\sectionrule}{\par\nobreak\vspace*{-.7\baselineskip}\leavevmode{\color{color1}\leaders\hbox{\rule{1pt}{0.4pt}}\hfill\kern0pt}} + \renewcommand*{\subsectionrule}{\leavevmode{\color{color1}\xleaders\hbox to 0.35em{\scriptsize.}\hfill}}\fi% different subsectionrules will not be perfectly aligned, but remaining space at the end of the fill will be distributed evenly between leaders, so it will be barely visible}} +\if@norules% + \renewcommand*{\sectionrule}{} + \renewcommand*{\subsectionrule}{}\fi + +\renewcommand*{\cvitem}[3][.25em]{% + \ifstrempty{#2}{}{\hintstyle{#2}: }{#3}% + \par\addvspace{#1}} + +\renewcommand*{\cvdoubleitem}[5][.25em]{% + \begin{minipage}[t]{\doubleitemcolumnwidth}\hintstyle{#2}: #3\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \begin{minipage}[t]{\doubleitemcolumnwidth}\ifstrempty{#4}{}{\hintstyle{#4}: }#5\end{minipage}% + \par\addvspace{#1}} + +\renewcommand*{\cvlistitem}[2][.25em]{% + \listitemsymbol\begin{minipage}[t]{\listitemcolumnwidth}#2\end{minipage}% + \par\addvspace{#1}} + +\renewcommand*{\cvlistdoubleitem}[3][.25em]{% + \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#2\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \ifstrempty{#3}% + {}% + {\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#3\end{minipage}}}} + +\renewcommand*{\cventry}[7][.25em]{ + \begin{tabular*}{\maincolumnwidth}{l@{\extracolsep{\fill}}r}% + % skip the company name and location line if both are empty, allowing one to show multiple roles within the same company without repeating it + \ifboolexpr{% + test {\ifstrempty{#4}} + and + test {\ifstrempty{#5}}}% + {}% + {{\bfseries #4} & {\bfseries #5}\\}% + {\itshape #3\ifstrempty{#6}{}{, #6}} & {\itshape #2}\\% + \end{tabular*}% + \ifx&% + \else{\\% + \begin{minipage}{\maincolumnwidth}% + \small#7% + \end{minipage}}\fi% + \par\addvspace{#1}} + +\@initializebox{\cvitemwithcommentmainbox} +\@initializelength{\cvitemwithcommentmainlength} +\@initializelength{\cvitemwithcommentcommentlength} +\renewcommand*{\cvitemwithcomment}[4][.25em]{% + \savebox{\cvitemwithcommentmainbox}{\ifstrempty{#2}{}{\hintstyle{#2}: }#3}% + \setlength{\cvitemwithcommentmainlength}{\widthof{\usebox{\cvitemwithcommentmainbox}}}% + \setlength{\cvitemwithcommentcommentlength}{\maincolumnwidth-\separatorcolumnwidth-\cvitemwithcommentmainlength}% + \begin{minipage}[t]{\cvitemwithcommentmainlength}\usebox{\cvitemwithcommentmainbox}\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \begin{minipage}[t]{\cvitemwithcommentcommentlength}\raggedleft\small\itshape#4\end{minipage}% + \par\addvspace{#1}} + +\renewenvironment{thebibliography}[1]% + {% + \bibliographyhead{\refname}% +% \small% + \begin{list}{\bibliographyitemlabel}% + {% + \setlength{\topsep}{0pt}% + \setlength{\labelwidth}{0pt}% + \ifthenelse{\equal{\bibliographyitemlabel}{}}% + {\setlength{\labelsep}{0pt}}% + {\setlength{\labelsep}{\separatorcolumnwidth}}% + \leftmargin\labelwidth% + \advance\leftmargin\labelsep% + \@openbib@code% + \usecounter{enumiv}% + \let\p@enumiv\@empty% + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy% + \clubpenalty4000%\@clubpenalty \clubpenalty% + \widowpenalty4000% + \sfcode`\.\@m% + \sfcode `\=1000\relax}% + {% + \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}% + \end{list}} + + +%------------------------------------------------------------------------------- +% letter style definition +%------------------------------------------------------------------------------- +% commands +\renewcommand*{\recomputeletterbodylengths}{% + \recomputecvbodylengths% + \setlength{\parskip}{6\p@}} + +\renewcommand*{\makeletterclosing}{ + \@closing\\[3em]% + {\bfseries\@firstname~\@lastname}% + \ifthenelse{\isundefined{\@enclosure}}{}{% + \\% + \vfil% + {\color{color2}\itshape\enclname: \@enclosure}}% + \vfil} + + +\endinput + + +%% end of file `moderncvbodyiii.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvbodyiv.sty b/public/lib/templates/template7/inputs/moderncvbodyiv.sty new file mode 100644 index 00000000..9127af18 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvbodyiv.sty @@ -0,0 +1,186 @@ +%% start of file `moderncvbodyiv.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvbodyiv}[2022-02-21 v2.3.1 modern curriculum vitae and letter body variant: 4] + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +% provides the commands for the skillmatrix as well as the command +% \recompute@cvskillmatrix@lengths +\RequirePackage[moderncvbodyiv]{moderncvskillmatrix} + +%------------------------------------------------------------------------------- +% overall body definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\sectionfont}{\Large\bfseries\upshape} +\renewcommand*{\subsectionfont}{\large\bfseries\itshape} +\renewcommand*{\hintfont}{\bfseries} + +% styles +\renewcommand*{\sectionstyle}[1]{{\sectionfont\textcolor{color1}{#1}}} +\renewcommand*{\subsectionstyle}[1]{{\subsectionfont\textcolor{color1}{#1}}} +\renewcommand*{\hintstyle}[1]{{\hintfont\textcolor{color0}{#1}}} + + +%------------------------------------------------------------------------------- +% resume body definition +%------------------------------------------------------------------------------- +% lengths +% used by \cvitem (and all children command) +\@initializelength{\hintscolumnwidth} \setlength{\hintscolumnwidth}{0.3\textwidth} +\@initializelength{\separatorcolumnwidth} \setlength{\separatorcolumnwidth}{0.025\textwidth} +\@initializelength{\maincolumnwidth} +% used by \cvdoubleitem +\@initializelength{\doubleitemcolumnwidth} +% used by \cvlistitem +\@initializelength{\listitemsymbolwidth} \settowidth{\listitemsymbolwidth}{\listitemsymbol} +\@initializelength{\listitemcolumnwidth} +% used by \cvlistdoubleitem +\@initializelength{\listdoubleitemcolumnwidth} + +% commands +\renewcommand*{\recomputecvbodylengths}{% + % body lengths + \setlength{\maincolumnwidth}{\textwidth-\leftskip-\rightskip}% + \setlength{\listitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth}% + \setlength{\doubleitemcolumnwidth}{\maincolumnwidth-\separatorcolumnwidth}% + \setlength{\doubleitemcolumnwidth}{0.5\doubleitemcolumnwidth}% + \setlength{\listdoubleitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth-\separatorcolumnwidth-\listitemsymbolwidth}% + \setlength{\listdoubleitemcolumnwidth}{0.5\listdoubleitemcolumnwidth}% + \recompute@cvskillmatrix@lengths + % regular lengths + \setlength{\parskip}{0\p@}} + +\RenewDocumentCommand{\section}{sm}{% + \par\addvspace{2.5ex}% + \phantomsection{}% reset the anchor for hyperrefs + \addcontentsline{toc}{section}{#2}% + \strut\sectionstyle{#2}% + \par\nobreak\addvspace{1ex}\@afterheading} + +\RenewDocumentCommand{\subsection}{sm}{% + \par\addvspace{1ex}% + \phantomsection{}% + \addcontentsline{toc}{subsection}{#2}% + \strut\subsectionstyle{#2}% + \par\nobreak\addvspace{0.5ex}\@afterheading} + +\renewcommand*{\cvitem}[3][.25em]{% + \ifthenelse{\equal{#2}{}}{}{\hintstyle{#2}: }{#3}% + \par\addvspace{#1}} + +\renewcommand*{\cvdoubleitem}[5][.25em]{% + \begin{minipage}[t]{\doubleitemcolumnwidth}\hintstyle{#2}: #3\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \begin{minipage}[t]{\doubleitemcolumnwidth}\ifthenelse{\equal{#4}{}}{}{\hintstyle{#4}: }#5\end{minipage}% + \par\addvspace{#1}} + +\renewcommand*{\cvlistitem}[2][.25em]{% + \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listitemcolumnwidth}#2\end{minipage}}} + +\renewcommand*{\cvlistdoubleitem}[3][.25em]{% + \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#2\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \ifthenelse{\equal{#3}{}}% + {}% + {\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#3\end{minipage}}}} + +\@initializebox{\cventryyearbox} +\@initializelength{\cventrytitleboxwidth} +\renewcommand*{\cventry}[7][.25em]{% + \savebox{\cventryyearbox}{% + \hspace*{2\separatorcolumnwidth}% + \hintstyle{#2}}% + \setlength{\cventrytitleboxwidth}{\widthof{\usebox{\cventryyearbox}}}% + \setlength{\cventrytitleboxwidth}{\maincolumnwidth-\cventrytitleboxwidth}% + \begin{minipage}{\maincolumnwidth}% + \parbox[t]{\cventrytitleboxwidth}{% + \strut% + {\bfseries#3}% + \ifthenelse{\equal{#4}{}}{}{, {\slshape#4}}% + \ifthenelse{\equal{#5}{}}{}{, #5}% + \ifthenelse{\equal{#6}{}}{}{, #6}% + .\strut}% + \usebox{\cventryyearbox}% + \end{minipage}\strut% + \ifx&% + \else{% + \newline{}% + \strut% + \begin{minipage}[t]{\maincolumnwidth}% + \small% + #7% + \end{minipage}}\fi% + \par\addvspace{#1}} + +\@initializebox{\cvitemwithcommentmainbox} +\@initializelength{\cvitemwithcommentmainlength} +\@initializelength{\cvitemwithcommentcommentlength} +\renewcommand*{\cvitemwithcomment}[4][.25em]{% + \savebox{\cvitemwithcommentmainbox}{\ifthenelse{\equal{#2}{}}{}{\hintstyle{#2}: }#3}% + \setlength{\cvitemwithcommentmainlength}{\widthof{\usebox{\cvitemwithcommentmainbox}}}% + \setlength{\cvitemwithcommentcommentlength}{\maincolumnwidth-\separatorcolumnwidth-\cvitemwithcommentmainlength}% + \begin{minipage}[t]{\cvitemwithcommentmainlength}\usebox{\cvitemwithcommentmainbox}\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \begin{minipage}[t]{\cvitemwithcommentcommentlength}\raggedleft\small\itshape#4\end{minipage}% + \par\addvspace{#1}} + +\renewenvironment{thebibliography}[1]% + {% + \bibliographyhead{\refname}% +% \small% + \begin{list}{\bibliographyitemlabel}% + {% + \setlength{\topsep}{0pt}% + \setlength{\labelwidth}{\hintscolumnwidth}% + \setlength{\labelsep}{\separatorcolumnwidth}% + \leftmargin\labelwidth% + \advance\leftmargin\labelsep% + \@openbib@code% + \usecounter{enumiv}% + \let\p@enumiv\@empty% + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy% + \clubpenalty4000%\@clubpenalty \clubpenalty% + \widowpenalty4000% + \sfcode`\.\@m% + \sfcode `\=1000\relax}% + {% + \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}% + \end{list}} + + +%------------------------------------------------------------------------------- +% letter style definition +%------------------------------------------------------------------------------- +% commands +\renewcommand*{\recomputeletterbodylengths}{% + \recomputecvbodylengths% + \setlength{\parskip}{6\p@}} + +\renewcommand*{\makeletterclosing}{ + \@closing\\[3em]% + {\bfseries\@firstname~\@lastname}% + \ifthenelse{\isundefined{\@enclosure}}{}{% + \\% + \vfil% + {\color{color2}\itshape\enclname: \@enclosure}}% + \vfil} + + +\endinput + + +%% end of file `moderncvbodyiv.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvbodyv.sty b/public/lib/templates/template7/inputs/moderncvbodyv.sty new file mode 100644 index 00000000..1f496929 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvbodyv.sty @@ -0,0 +1,221 @@ +%% start of file `moderncvbodyv.sty'. +%% Copyright 2015-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvbodyv}[2022-02-21 v2.3.1 modern curriculum vitae and letter body variant: 5] + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +% provides the commands for the skillmatrix as well as the command +% \recompute@cvskillmatrix@lengths +\RequirePackage[moderncvbodyv]{moderncvskillmatrix} + +%------------------------------------------------------------------------------- +% overall style definition +%------------------------------------------------------------------------------- + + +%------------------------------------------------------------------------------- +% resume style definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\sectionfont}{\Large\mdseries\upshape} +\renewcommand*{\subsectionfont}{\large\mdseries\slshape} +\renewcommand*{\hintfont}{\bfseries} + +% styles +\renewcommand*{\sectionstyle}[1]{{\sectionfont\textcolor{color1}{#1}}} +\renewcommand*{\subsectionstyle}[1]{{\subsectionfont\textcolor{color1}{#1}}} +\renewcommand*{\hintstyle}[1]{{\hintfont\textcolor{color0}{#1}}} + +% lengths +% used by \cvitem (and all children command) +\@initializelength{\hintscolumnwidth} \setlength{\hintscolumnwidth}{0.25\textwidth} +\@initializelength{\separatorcolumnwidth} \setlength{\separatorcolumnwidth}{0.025\textwidth} +\@initializelength{\separatorrulewidth} \setlength{\separatorrulewidth}{1.2\p@}% +\@initializelength{\maincolumnwidth} +% used by \cvdoubleitem +\@initializelength{\doubleitemcolumnwidth} +% used by \cvlistitem +\@initializelength{\listitemsymbolwidth} \settowidth{\listitemsymbolwidth}{\listitemsymbol} +\@initializelength{\listitemcolumnwidth} +%\@initializelength{\listitemmaincolumnwidth} +% used by \cvlistdoubleitem +\@initializelength{\listdoubleitemcolumnwidth} +%\@initializelength{\listdoubleitemmaincolumnwidth} + +% commands +\@initializecommand{\recomputecvbodylengths}{% + % body lengths + \setlength{\maincolumnwidth}{\textwidth-\leftskip-\rightskip-\separatorcolumnwidth-\separatorcolumnwidth-\hintscolumnwidth-\separatorrulewidth}% + \setlength{\listitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth}% + \setlength{\doubleitemcolumnwidth}{\maincolumnwidth-\separatorcolumnwidth}% + \setlength{\doubleitemcolumnwidth}{0.5\doubleitemcolumnwidth}% + \setlength{\listdoubleitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth-\separatorcolumnwidth-\listitemsymbolwidth}% + \setlength{\listdoubleitemcolumnwidth}{0.5\listdoubleitemcolumnwidth}% + \recompute@cvskillmatrix@lengths + % regular lengths + \setlength{\parskip}{0\p@}} + +\@initializeif{\if@aftersection}\@aftersectionfalse% +\RenewDocumentCommand{\section}{sm}{% + \addvspace{2.5ex}% + \phantomsection{}% reset the anchor for hyperrefs + \addcontentsline{toc}{section}{#2}% + \noindent\rlap{\@cvitem{\raggedleft\sectionstyle{#2}}{}}% + \nobreak\@afterheading\@aftersectiontrue\ignorespaces} + +%\@initializeif{\if@aftersubsection}\@aftersubsectionfalse% +\RenewDocumentCommand{\subsection}{sm}{% + %\addvspace{1ex}% + \vspace*{-\arrayrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :( + \if@aftersection% + \par\ignorespaces\fi% + \phantomsection{}% reset the anchor for hyperrefs + \addcontentsline{toc}{subsection}{#2}% + \noindent\rlap{\@cvitem{\if@aftersection\else\@moderncvstrut{4pt}{24pt}\fi\raggedleft\subsectionstyle{#2}}{}}% + \nobreak\@afterheading\@aftersectiontrue\ignorespaces} + +\renewcommand*{\cvitem}[3][.5ex]{% + \@cvitem[#1]{}{\ifthenelse{\equal{#2}{}}{}{\hintstyle{#2}: }{#3}}% + } +% \RenewDocumentCommand{\cvitem}{+O{.5ex} +m +m}{% +% \IfNoValueTF{#2}{% +% \@cvitem[#1]{}{#3}% +% }{% +% \@cvitem[#1]{}{\hintstyle{#2}: {#3}}% +% }% +% } + +% underlying command to implement \cvitem, \subsection and \section +\newcommand*{\@cvitem}[3][.5ex]{% + \arrayrulecolor{color1}% + \setlength\arrayrulewidth{\separatorrulewidth}% + \if@aftersection\else% + \vspace*{-\separatorrulewidth}\fi% HACK; I don't understand where the space is coming from, nor what it's exact value is :( + \noindent% +% \setlength{\fboxsep}{0pt}\framebox{% start of debuging + \begin{tabular}[t]{@{}p{\hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}p{\maincolumnwidth}@{}}% + \@moderncvstrut{4pt}{16pt}#2 \\[#1]% the spacing needs to be inside the cell for the vertical rule to extend correctly + \end{tabular}% +% }% end of debuging + \par\@aftersectionfalse\ignorespaces} + +\renewcommand*{\cvdoubleitem}[5][.5ex]{% + \@cvitem[#1]{}{% + \begin{minipage}[t]{\doubleitemcolumnwidth}\hintstyle{#2}: #3\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \begin{minipage}[t]{\doubleitemcolumnwidth}\ifthenelse{\equal{#4}{}}{}{\hintstyle{#4}: }#5\end{minipage}}} + +\renewcommand*{\cvlistitem}[2][.5ex]{% + \@cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listitemcolumnwidth}#2\end{minipage}}} + +\renewcommand*{\cvlistdoubleitem}[3][.5ex]{% + \@cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#2\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \ifthenelse{\equal{#3}{}}% + {}% + {\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#3\end{minipage}}}} + +\@initializebox{\cventryyearbox} +\@initializelength{\cventrytitleboxwidth} +\renewcommand*{\cventry}[7][.5ex]{% + \savebox{\cventryyearbox}{% + \hspace*{2\separatorcolumnwidth}% + \hintstyle{#2}}% + \setlength{\cventrytitleboxwidth}{\widthof{\usebox{\cventryyearbox}}}% + \setlength{\cventrytitleboxwidth}{\maincolumnwidth-\cventrytitleboxwidth}% + \cvitem[#1]{}{% + \parbox[t]{\cventrytitleboxwidth}{% + \strut% + {\bfseries#3}% + \ifthenelse{\equal{#4}{}}{}{, {\slshape#4}}% + \ifthenelse{\equal{#5}{}}{}{, #5}% + \ifthenelse{\equal{#6}{}}{}{, #6}% + .\strut}% + \usebox{\cventryyearbox}}% + \ifx&% + \else% + \vspace*{-4pt}% + \cvitem[#1]{}{\small#7}\fi} + +\@initializebox{\cvitemwithcommentmainbox} +\@initializelength{\cvitemwithcommentmainlength} +\@initializelength{\cvitemwithcommentcommentlength} +\renewcommand*{\cvitemwithcomment}[4][.5ex]{% + \savebox{\cvitemwithcommentmainbox}{\ifthenelse{\equal{#2}{}}{}{\hintstyle{#2}: }#3}% + \setlength{\cvitemwithcommentmainlength}{\widthof{\usebox{\cvitemwithcommentmainbox}}}% + \setlength{\cvitemwithcommentcommentlength}{\maincolumnwidth-\separatorcolumnwidth-\cvitemwithcommentmainlength}% + \@cvitem[#1]{}{% + \begin{minipage}[t]{\cvitemwithcommentmainlength}\usebox{\cvitemwithcommentmainbox}\end{minipage}% + \hfill% fill of \separatorcolumnwidth + \begin{minipage}[t]{\cvitemwithcommentcommentlength}\raggedleft\small\itshape#4\end{minipage}}} + +\renewenvironment{thebibliography}[1]% BUG/TODO: remove extra space between heading and first bibliography entry, as well as after last one + {% + \bibliographyhead{\refname}% +% \small% + \arrayrulecolor{color1}% + \setlength\arrayrulewidth{\separatorrulewidth}% + \noindent% + \begin{tabular}[t]{@{}p{\hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}p{\maincolumnwidth}@{}}% + \@moderncvstrut{4pt}{16pt} &% + \begin{list}{\bibliographyitemlabel}{% + \setlength{\topsep}{0pt}% + \setlength{\partopsep}{0pt}% + \setlength{\labelwidth}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\parskip}{0pt}% + \ifthenelse{\equal{\bibliographyitemlabel}{}}% + {\setlength{\labelsep}{0pt}}% + {\setlength{\labelsep}{\separatorcolumnwidth}}% + \leftmargin\labelwidth% + \advance\leftmargin\labelsep% + \@openbib@code% + \usecounter{enumiv}% + \let\p@enumiv\@empty% + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy% + \clubpenalty4000%\@clubpenalty \clubpenalty% + \widowpenalty4000% + \sfcode`\.\@m% + \sfcode `\=1000\relax}% + {% + \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}% + \end{list}% + \\[.5ex]% + \end{tabular}% + \par\@aftersectionfalse\ignorespaces} + + +%------------------------------------------------------------------------------- +% letter style definition +%------------------------------------------------------------------------------- +% commands +\renewcommand*{\recomputeletterbodylengths}{% + \recomputecvbodylengths% + \setlength{\parskip}{6\p@}} + +\renewcommand*{\makeletterclosing}{ + \@closing\\[3em]% + {\bfseries \@firstname~\@lastname}% + \ifthenelse{\isundefined{\@enclosure}}{}{% + \\% + \vfill% + {\color{color2}\itshape\enclname: \@enclosure}}} + + +\endinput + + +%% end of file `moderncvbodyv.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvcollection.sty b/public/lib/templates/template7/inputs/moderncvcollection.sty new file mode 100644 index 00000000..5d3432e6 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvcollection.sty @@ -0,0 +1,92 @@ +%% start of file `moderncvcollection.sty'. +%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvcollection}[2022-02-21 v2.3.1 moderncv collections] + + +%------------------------------------------------------------------------------- +% requirements +%------------------------------------------------------------------------------- + + +\RequirePackage{ifthen} + + +%------------------------------------------------------------------------------- +% code +%------------------------------------------------------------------------------- + +% creates a new collection +% usage: \collectionnew{<collection name>} +\NewDocumentCommand\collectionnew{m}{% + \newcounter{collection@#1@count}% +}% + +% adds an item to a collection +% usage: \collectionadd[<optional key>]{<collection name>}{<item to add>} +\NewDocumentCommand\collectionadd{ O{} m m }{% + \expandafter\def\csname collection@#2@item\roman{collection@#2@count}\endcsname{#3}% + \def\optional@FirstArg{#1}% + \ifdefempty{\optional@FirstArg}{% + \relax% if #1 is empty + }{% + \expandafter\def\csname collection@#2@key\roman{collection@#2@count}\endcsname{#1}% + }% + \stepcounter{collection@#2@count}% +}% +% returns the number of items in a collection +% usage: \collectioncount{<collection name>} +\NewDocumentCommand\collectioncount{m}{% + \value{collection@#1@count}% +}% +% gets an item from a collection +% usage: \collectiongetitem{<collection name>}{<element id>} +% where <element id> is an integer between 0 and (collectioncount-1) +\NewDocumentCommand\collectiongetitem{m m}{% + \csname collection@#1@item\romannumeral #2\endcsname% +}% + +% gets a key from a collection +% usage: \collectiongetkey{<collection name>}{<element id>} +% where <element id> is an integer between 0 and (collectioncount-1) +\NewDocumentCommand\collectiongetkey{m m}{% + \csname collection@#1@key\romannumeral #2\endcsname% +}% +% loops through a collection and perform the given operation on every element +% usage: \collectionloop{<collection name>}{<operation sequence>} +% where <operation sequence> is the code sequence to be evaluated for each collection item, +% code which can refer to \collectionloopid, \collectionloopkey, \collectionloopitem and +% \collectionloopbreak +\newcounter{collection@iterator} +\NewDocumentCommand\collectionloopbreak{}{\let\iterate\relax} +\NewDocumentCommand\collectionloop{m m}{% + \setcounter{collection@iterator}{0}% + \loop\ifnum\value{collection@iterator}<\value{collection@#1@count}% + \def\collectionloopid{\arabic{collection@iterator}}% + \def\collectionloopitem{\collectiongetitem{#1}{\collectionloopid}}% + \def\collectionloopkey{\collectiongetkey{#1}{\collectionloopid}}% + #2% + \stepcounter{collection@iterator}% + \repeat% +} + +% loops through a collection and finds the (first) element matching the given key +% usage: \collectionfindbykey{<collection name>}{key>} +\NewDocumentCommand\collectionfindbykey{m m}{% + \collectionloop{#1}{% + \ifthenelse{\equal{\collectionloopkey}{#2}}{\collectionloopitem\collectionloopbreak}{}}% +}% + +\endinput + + +%% end of file `moderncvcollection.cls'. diff --git a/public/lib/templates/template7/inputs/moderncvcolorblack.sty b/public/lib/templates/template7/inputs/moderncvcolorblack.sty new file mode 100644 index 00000000..ea3653ea --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvcolorblack.sty @@ -0,0 +1,27 @@ +%% start of file `moderncvcolorblack.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvcolorblack}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: black] + + +%------------------------------------------------------------------------------- +% color scheme definition +%------------------------------------------------------------------------------- +\definecolor{color0}{rgb}{0,0,0}% black +\definecolor{color1}{rgb}{0,0,0}% black +\definecolor{color2}{rgb}{0,0,0}% black + + +\endinput + + +%% end of file `moderncvcolorblack.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvcolorblue.sty b/public/lib/templates/template7/inputs/moderncvcolorblue.sty new file mode 100644 index 00000000..b02992e1 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvcolorblue.sty @@ -0,0 +1,27 @@ +%% start of file `moderncvcolorblue.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvcolorblue}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: blue] + + +%------------------------------------------------------------------------------- +% color scheme definition +%------------------------------------------------------------------------------- +\definecolor{color0}{rgb}{0,0,0}% black +\definecolor{color1}{rgb}{0.22,0.45,0.70}% light blue +\definecolor{color2}{rgb}{0.45,0.45,0.45}% dark grey + + +\endinput + + +%% end of file `moderncvcolorblue.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvcolorburgundy.sty b/public/lib/templates/template7/inputs/moderncvcolorburgundy.sty new file mode 100644 index 00000000..775f033f --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvcolorburgundy.sty @@ -0,0 +1,27 @@ +%% start of file `moderncvcolorburgundy.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvcolorburgundy}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: burgundy] + + +%------------------------------------------------------------------------------- +% color scheme definition +%------------------------------------------------------------------------------- +\definecolor{color0}{rgb}{0,0,0}% black +\definecolor{color1}{rgb}{0.596078,0,0}% burgundy: 139/255 (0.545098) or 152/255 (0.596078) +\definecolor{color2}{rgb}{0.45,0.45,0.45}% dark grey + + +\endinput + + +%% end of file `moderncvcolorburgundy.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvcolorgreen.sty b/public/lib/templates/template7/inputs/moderncvcolorgreen.sty new file mode 100644 index 00000000..891c3290 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvcolorgreen.sty @@ -0,0 +1,27 @@ +%% start of file `moderncvcolorgreen.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvcolorgreen}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: green] + + +%------------------------------------------------------------------------------- +% color scheme definition +%------------------------------------------------------------------------------- +\definecolor{color0}{rgb}{0,0,0}% black +\definecolor{color1}{rgb}{0.35,0.70,0.30}% green +\definecolor{color2}{rgb}{0.45,0.45,0.45}% dark grey + + +\endinput + + +%% end of file `moderncvcolorgreen.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvcolorgrey.sty b/public/lib/templates/template7/inputs/moderncvcolorgrey.sty new file mode 100644 index 00000000..37d2b577 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvcolorgrey.sty @@ -0,0 +1,27 @@ +%% start of file `moderncvcolorgrey.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvcolorgrey}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: grey] + + +%------------------------------------------------------------------------------- +% color scheme definition +%------------------------------------------------------------------------------- +\definecolor{color0}{rgb}{0,0,0}% black +\definecolor{color1}{rgb}{0.55,0.55,0.55}% dark grey +\definecolor{color2}{rgb}{0.55,0.55,0.55}% dark grey + + +\endinput + + +%% end of file `moderncvcolorgrey.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvcolororange.sty b/public/lib/templates/template7/inputs/moderncvcolororange.sty new file mode 100644 index 00000000..f249fd7d --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvcolororange.sty @@ -0,0 +1,27 @@ +%% start of file `moderncvcolororange.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvcolororange}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: orange] + + +%------------------------------------------------------------------------------- +% color scheme definition +%------------------------------------------------------------------------------- +\definecolor{color0}{rgb}{0,0,0}% black +\definecolor{color1}{rgb}{0.95,0.55,0.15}% orange +\definecolor{color2}{rgb}{0.45,0.45,0.45}% dark grey + + +\endinput + + +%% end of file `moderncvcolororange.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvcolorpurple.sty b/public/lib/templates/template7/inputs/moderncvcolorpurple.sty new file mode 100644 index 00000000..22053d78 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvcolorpurple.sty @@ -0,0 +1,27 @@ +%% start of file `moderncvcolorpurple.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvcolorpurple}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: purple] + + +%------------------------------------------------------------------------------- +% color scheme definition +%------------------------------------------------------------------------------- +\definecolor{color0}{rgb}{0,0,0}% black +\definecolor{color1}{rgb}{0.50,0.33,0.80}% purple +\definecolor{color2}{rgb}{0.45,0.45,0.45}% dark grey + + +\endinput + + +%% end of file `moderncvcolorpurple.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvcolorred.sty b/public/lib/templates/template7/inputs/moderncvcolorred.sty new file mode 100644 index 00000000..68b1335c --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvcolorred.sty @@ -0,0 +1,27 @@ +%% start of file `moderncvcolorred.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvcolorred}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: red] + + +%------------------------------------------------------------------------------- +% color scheme definition +%------------------------------------------------------------------------------- +\definecolor{color0}{rgb}{0,0,0}% black +\definecolor{color1}{rgb}{0.95,0.20,0.20}% red +\definecolor{color2}{rgb}{0.45,0.45,0.45}% dark grey + + +\endinput + + +%% end of file `moderncvcolorred.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvcompatibility.sty b/public/lib/templates/template7/inputs/moderncvcompatibility.sty new file mode 100644 index 00000000..fb9a8c43 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvcompatibility.sty @@ -0,0 +1,107 @@ +%% start of file `moderncvcompatibility.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvcompatibility}[2022-02-21 v2.3.1 modern curriculum vitae and letter compatibility patches] + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- + + +%------------------------------------------------------------------------------- +% package options +%------------------------------------------------------------------------------- +% old casual option (version 0.1) +%\DeclareOption{casual}{\input{moderncvstylecasual.sty}} + +% old classic option (version 0.1) +%\DeclareOption{classic}{\input{moderncvstyleclassic.sty}} + +\DeclareOption*{} + +% process given options +\ProcessOptions\relax + +%------------------------------------------------------------------------------- +% definitions +%------------------------------------------------------------------------------- +% compatibility with version 0.1 +\newcommand*{\cvresume}[2]{\cvlistdoubleitem{#1}{#2}} + +% compatibility with versions <= 0.2 +% section, cvline, ... with width argument... +%\newcommand*{\section}[2][0.825]{% +% \closesection{}% +% \@sectionopentrue% +% \addcontentsline{toc}{part}{#2} +% \begin{longtable}[t]{@{}r@{\hspace{.025\textwidth}}@{}p{#1\textwidth}@{}}% +%% \colorrule{.15\textwidth}&\mbox{\color{sectiontitlecolor}\sectionfont#2}\\[1ex]}% +% {\color{sectionrectanglecolor}\rule{0.15\textwidth}{1ex}}&\mbox{\color{sectiontitlecolor}\sectionfont#2}\\[1ex]}% +%\newcommand*{\cvline}[3][.825]{% +% \begin{minipage}[t]{\hintscolumnwidth}\raggedleft\small\sffamily#2\end{minipage}&\begin{minipage}[t]{\maincolumnwidth}#3\end{minipage}\\} +%\newcommand*{\cvitem}[3][.825]{% +% \cvline[#1]{#2}{#3\vspace*{.75em}}} % the \vspace*{} inside the cvline environment is a hack... (should conceptually be outside the environment) + +% compatibility with versions <= 0.5 +%\newcommand*{\cvitem}[2]{\cvline{#1}{#2}} +%\newcommand*{\moderncvstyle}[1]{\moderncvtheme{#1}} + +% compatibility with versions <= 0.7 +\newcommand*{\closesection}{} +\newcommand*{\emptysection}{} +\newcommand*{\sethintscolumnlength}[1]{% + \setlength{\hintscolumnwidth}{#1}% + \recomputelengths} +\newcommand*{\sethintscolumntowidth}[1]{% + \settowidth{\hintscolumnwidth}{#1}% + \recomputelengths} + +% compatibility with versions <= 0.15 +\newcommand*{\cvline}[2]{\cvitem{#1}{#2}} +\newcommand*{\cvlanguage}[3]{\cvitemwithcomment{#1}{#2}{#3}} +\newcommand*{\cvcomputer}[4]{\cvdoubleitem{#1}{\small#2}{#3}{\small#4}} +\newcommand*{\moderncvtheme}[2][blue]{% + \moderncvcolor{#1}% + \moderncvstyle{#2}} + +% compatibility with versions <= 0.19 +\newcommand*{\maketitle}{\makecvtitle}% +\title{}% to avoid LaTeX complaining that \maketitle is a called without first a call to \title +\newcommand*{\maketitlenamewidth}{\makecvtitlenamewidth} + +% compatibility with versions <= 1.3.0 +\newcommand*{\firstname}[1]{\def\@firstname{#1}} +\newcommand*{\lastname}[1]{\def\@lastname{#1}} +\newcommand*{\givenname}[1]{\def\@firstname{#1}} +\newcommand*{\familyname}[1]{\def\@lastname{#1}} +\def\@familyname{\@lastname} + +% compatibility with versions <= 1.4.0 +\newcommand*{\mobile}[1]{\collectionadd[mobile]{phones}{#1}} +%\newcommand*{\phone}[1]{\collectionadd[fixed]{phones}{#1}}% implicit, as \phone{...} defaults to \phone[fixed]{...} +\newcommand*{\fax}[1]{\collectionadd[fax]{phones}{#1}} +\newcommand*{\@mobile}{\collectionfindbykey{phones}{mobile}} +\newcommand*{\@phone}{\collectionfindbykey{phones}{fixed}} +\newcommand*{\@fax}{\collectionfindbykey{phones}{fax}} +\newcommand*{\phonesymbol}{\fixedphonesymbol} +\newcommand*{\mobilesymbol}{\mobilephonesymbol} +\newcommand*{\faxsymbol}{\faxphonesymbol} + +% compatibility with versions <= 1.5.1 +\newcommand*{\makecvtitlenamewidth}{\makecvheadnamewidth} % only used in header variants 1 and 4, themself used by the classic and oldstyle styles + + +\endinput + + +%% end of file `moderncvcompatibility.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvdebugtools.sty b/public/lib/templates/template7/inputs/moderncvdebugtools.sty new file mode 100644 index 00000000..b28e409b --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvdebugtools.sty @@ -0,0 +1,54 @@ +%% start of file `moderncvdebugtools.sty'. +%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvdebugtools}[2022-02-21 v2.3.1 modern curriculum vitae and letter debug tools] + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +\RequirePackage{tikz} + + +%------------------------------------------------------------------------------- +% debug tools +%------------------------------------------------------------------------------- +% code of \tracedebugvrule and \tracedebughrule provided by Gonzalo Medina on TeX.SX (cfr tex.stackexchange.com/a/110805/10102) +\newcounter{debugrule} +\pgfdeclarelayer{background} +\pgfsetlayers{background,main} + +\DeclareDocumentCommand{\tracedebugvrule}{oO{0pt}}{% + \stepcounter{debugrule}% + \begin{tikzpicture}[remember picture,overlay] + \begin{pgfonlayer}{background} + \coordinate (a\thedebugrule); + \draw[red,thin,#1] + ([xshift=#2]a\thedebugrule|-current page.north) -- ([xshift=#2]a\thedebugrule|-current page.south); + \end{pgfonlayer} + \end{tikzpicture}} + +\DeclareDocumentCommand{\tracedebughrule}{oO{0pt}}{% + \stepcounter{debugrule}% + \begin{tikzpicture}[remember picture,overlay] + \begin{pgfonlayer}{background} + \coordinate (b\thedebugrule); + \draw[red,thin,#1] + ([yshift=#2]b\thedebugrule-|current page.west) -- ([yshift=#2]b\thedebugrule-|current page.east); + \end{pgfonlayer} + \end{tikzpicture}} + + +\endinput + + +%% end of file `moderncvdebugtools.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvfooti.sty b/public/lib/templates/template7/inputs/moderncvfooti.sty new file mode 100644 index 00000000..37036584 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvfooti.sty @@ -0,0 +1,136 @@ +%% start of file `moderncvfooti.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvfooti}[2022-02-21 v2.3.1 modern curriculum vitae and letter footer variant: 1] + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- + + +%------------------------------------------------------------------------------- +% overall foot definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\addressfont}{\normalsize\mdseries\slshape} + +% symbols +% footer symbol used to separate footer elements +\newcommand*{\footsymbol}{% + {\hspace{1em}{\rmfamily\textbullet}\hspace{1em}}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n + +% lengths +\@initializelength{\footwidth}% +\renewcommand*{\recomputefootlengths}{% + \setlength{\footwidth}{0.8\textwidth}} + +% commands +% internal command to add an element to the footer +% it collects the elements in a temporary box, and checks when to flush the box +\@initializebox{\footbox}% +\@initializebox{\foottempbox}% +\@initializelength{\footboxwidth}% +\@initializeif{\if@firstfootelement}\@firstfootelementtrue% +% adds an element to the footer, separated by footsymbol +% usage: \addtofoot[footsymbol]{element} +\newcommand*{\addtofoot}[2][\footsymbol]{% + \if@firstfootelement% + \savebox{\foottempbox}{\usebox{\footbox}#2}% + \else% + \savebox{\foottempbox}{\usebox{\footbox}#1#2}\fi% + \settowidth{\footboxwidth}{\usebox{\foottempbox}}% + \ifnum\footboxwidth<\footwidth% + \savebox{\footbox}{\usebox{\foottempbox}}% + \@firstfootelementfalse% + \else% + \flushfoot\\% + \savebox{\footbox}{#2}% + \savebox{\foottempbox}{#2}% + \settowidth{\footboxwidth}{\usebox{\footbox}}% + \@firstfootelementfalse\fi} +% internal command to flush the foot +\newcommand*{\flushfoot}{% + \strut\usebox{\footbox}% + \savebox{\footbox}{}% + \savebox{\foottempbox}{}% + \setlength{\footboxwidth}{0pt}} + + +%------------------------------------------------------------------------------- +% resume foot definition +%------------------------------------------------------------------------------- +% lenghts +\renewcommand*{\recomputecvfootlengths}{\recomputefootlengths} + +% commands +\renewcommand*{\makecvfoot}{% + \recomputecvfootlengths{}% + \fancypagestyle{plain}{% + \fancyfoot[c]{% + \parbox[b]{\footwidth}{% + \centering% + \color{color2}\addressfont% + \vspace{\baselineskip}% forces a white line to ensure space between main text and footer (as footer height can't be known in advance) + \ifthenelse{\isundefined{\@addressstreet}}{}{\addtofoot[]{\addresssymbol\@addressstreet}% + \ifthenelse{\equal{\@addresscity}{}}{}{\addtofoot[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\addtofoot[~--~]{\@addresscountry}}% + \flushfoot\@firstfootelementtrue\\}% + \ifthenelse{\isundefined{\@born}}{}{\addtofoot{\bornsymbol\@born}\flushfoot\@firstfootelementtrue\\}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \addtofoot{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}% + \ifthenelse{\isundefined{\@email}}{}{\addtofoot{\emailsymbol\emaillink{\@email}}}% + \ifthenelse{\isundefined{\@homepage}}{}{\addtofoot{\homepagesymbol\httpslink{\@homepage}}}% + \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link + \addtofoot{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}% + \ifthenelse{\isundefined{\@extrainfo}}{}{\addtofoot{\@extrainfo}}% + \ifthenelse{\lengthtest{\footboxwidth=0pt}}{}{\flushfoot}% the lengthtest is required to avoid flushing an empty footer, which could cause a blank line due to the \\ after the address, if no other personal info is used + }}}% + \pagestyle{plain}} + + +%------------------------------------------------------------------------------- +% letter foot definition +%------------------------------------------------------------------------------- +% commands +\renewcommand*{\recomputeletterfootlengths}{\recomputefootlengths} +\renewcommand*{\makeletterfoot}{% + \recomputeletterfootlengths{}% + \fancypagestyle{plain}{% + \fancyfoot[c]{% + \parbox[b]{\footwidth}{% + \centering% + \addressfont\color{color2}% + \vspace{\baselineskip}% forces a white line to ensure space between main text and footer (as footer height can't be known in advance) + \vspace{-\baselineskip}% to cancel out the extra vertical space taken by the name (below) and ensure perfect alignment of letter and cv footers + \strut{\bfseries\upshape\@firstname~\@lastname}\\% the \strut is required to ensure the line is exactly \baselineskip tall + \ifthenelse{\isundefined{\@addressstreet}}{}{\addtofoot[]{\addresssymbol\@addressstreet}% + \ifthenelse{\equal{\@addresscity}{}}{}{\addtofoot[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\addtofoot[~--~]{\@addresscountry}}% + \flushfoot\@firstfootelementtrue\\}% + \ifthenelse{\isundefined{\@born}}{}{\addtofoot{\bornsymbol\@born}\flushfoot\@firstfootelementtrue\\}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \addtofoot{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}% + \ifthenelse{\isundefined{\@email}}{}{\addtofoot{\emailsymbol\emaillink{\@email}}}% + \ifthenelse{\isundefined{\@homepage}}{}{\addtofoot{\homepagesymbol\httpslink{\@homepage}}}% + \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link + \addtofoot{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}% + \ifthenelse{\isundefined{\@extrainfo}}{}{\addtofoot{\@extrainfo}}% + \ifthenelse{\lengthtest{\footboxwidth=0pt}}{}{\flushfoot}% the lengthtest is required to avoid flushing an empty footer, which could cause a blank line due to the \\ after the address, if no other personal info is used + }}}% + \pagestyle{plain}} + + +\endinput + + +%% end of file `moderncvfooti.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvheadi.sty b/public/lib/templates/template7/inputs/moderncvheadi.sty new file mode 100644 index 00000000..087cf776 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvheadi.sty @@ -0,0 +1,187 @@ +%% start of file `moderncvheadi.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvheadi}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 1] + +% details options: "details" (default) or "nodetails" +\@initializeif{\if@details}\@detailsfalse +\DeclareOption{details} {\@detailstrue} +\DeclareOption{nodetails} {\@detailsfalse} + +% left/right options: "left" (default) or "right" +\@initializeif{\if@left} \@leftfalse +\DeclareOption{left} {\@lefttrue\@rightfalse} +\@initializeif{\if@right}\@rightfalse +\DeclareOption{right} {\@leftfalse\@righttrue} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{details,left} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- + + +%------------------------------------------------------------------------------- +% overall head definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\namefont}{\fontsize{34}{36}\mdseries\upshape} +\renewcommand*{\titlefont}{\LARGE\mdseries\slshape} +\renewcommand*{\addressfont}{\small\mdseries\slshape} +\renewcommand*{\quotefont}{\large\slshape} + +% styles +\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color0}{#1}}} +\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2}{#1}}} +\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}} +\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}} + + +%------------------------------------------------------------------------------- +% resume head definition +%------------------------------------------------------------------------------- +% lengths +\@initializelength{\quotewidth} +\@initializelength{\makecvheadnamewidth}% optional makecvheadname width to force a certain width (if set/remains to 0pt, the width is calculated automatically) +\renewcommand*{\recomputecvheadlengths}{% + \setlength{\quotewidth}{0.65\textwidth}} + +% commands +\renewcommand*{\makecvhead}{% + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputecvlengths% + % optional detailed information (pre-rendering) + \@initializebox{\makecvheaddetailsbox}% + \if@details% + \def\phonesdetails{}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \protected@edef\phonesdetails{\phonesdetails\protect\makenewline\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}% + \def\socialsdetails{}% + \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link + \protected@edef\socialsdetails{\socialsdetails\protect\makenewline\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}% + \savebox{\makecvheaddetailsbox}{% + \addressfont\color{color2}% + \if@left\begin{tabular}[b]{@{}r@{}}\fi% + \if@right\begin{tabular}[b]{@{}l@{}}\fi% + \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet% + \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}% + \ifthenelse{\isundefined{\@born}}{}{\makenewline\bornsymbol\@born}% + \phonesdetails% needs to be pre-rendered as loops and tabulars seem to conflict + \ifthenelse{\isundefined{\@email}}{}{\makenewline\emailsymbol\emaillink{\@email}}% + \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\homepagesymbol\httpslink{\@homepage}}% + \socialsdetails% needs to be pre-rendered as loops and tabulars seem to conflict + \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}% + \end{tabular} + }\fi% + % optional photo (pre-rendering) + \@initializebox{\makecvheadpicturebox}% + \savebox{\makecvheadpicturebox}{% + \ifthenelse{\isundefined{\@photo}}% + {}% + {% + \if@left% + \hspace*{\separatorcolumnwidth}\fi% + \color{color1}% + \setlength{\fboxrule}{\@photoframewidth}% + \ifdim\@photoframewidth=0pt% + \setlength{\fboxsep}{0pt}\fi% + \framebox{\includegraphics[width=\@photowidth]{\@photo}}}% + \if@right% + \hspace*{\separatorcolumnwidth}\fi}% + % name and title (pre-rendering) + \@initializelength{\makecvheaddetailswidth}\settowidth{\makecvheaddetailswidth}{\usebox{\makecvheaddetailsbox}}% + \@initializelength{\makecvheadpicturewidth}\settowidth{\makecvheadpicturewidth}{\usebox{\makecvheadpicturebox}}% + \ifthenelse{\lengthtest{\makecvheadnamewidth=0pt}}% check for dummy value (equivalent to \ifdim\makecvheadnamewidth=0pt) + {\setlength{\makecvheadnamewidth}{\textwidth-\makecvheaddetailswidth-\makecvheadpicturewidth}}% + {}% + \@initializebox{\makecvheadnamebox}% + \savebox{\makecvheadnamebox}{% + \begin{minipage}[b]{\makecvheadnamewidth}% + \if@left\raggedright\fi% + \if@right\raggedleft\fi% + \namestyle{\@firstname\ \@lastname}% + \ifthenelse{\equal{\@title}{}}{}{\\[1.25em]\titlestyle{\@title}}% + \end{minipage}}% + % rendering + \if@left% + \usebox{\makecvheadnamebox}% + \hfill% + \llap{\usebox{\makecvheaddetailsbox}}% \llap is used to suppress the width of the box, allowing overlap if the value of makecvheadnamewidth is forced + \usebox{\makecvheadpicturebox}\fi% + \if@right% + \usebox{\makecvheadpicturebox}% + \rlap{\usebox{\makecvheaddetailsbox}}% \llap is used to suppress the width of the box, allowing overlap if the value of makecvheadnamewidth is forced + \hfill% + \usebox{\makecvheadnamebox}\fi% + \\[2.5em]% + % optional quote + \ifthenelse{\isundefined{\@quote}}% + {}% + {{\centering\begin{minipage}{\quotewidth}\centering\quotestyle{\@quote}\end{minipage}\\[2.5em]}}% + \par}% to avoid weird spacing bug at the first section if no blank line is left after \makecvhead + + +%------------------------------------------------------------------------------- +% letter head definition +%------------------------------------------------------------------------------- +% lengths +%\renewcommand*{\recomputeletterheadlengths}{} + +% commands +\renewcommand*{\makeletterhead}{% + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputeletterlengths% + % sender contact info + \hfill% + \begin{minipage}{.5\textwidth}% + % optional detailed information + \if@details% + \raggedleft% + \addressfont\textcolor{color2}{% + {\bfseries\upshape\@firstname~\@lastname}\@firstdetailselementfalse% + % optional detailed information + \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet% + \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \makenewline\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}% + \ifthenelse{\isundefined{\@email}}{}{\makenewline\emailsymbol\emaillink{\@email}}% + \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\homepagesymbol\httpslink{\@homepage}}% + \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}}\fi% + \end{minipage}\\[1em] + % recipient block + \begin{minipage}[t]{.5\textwidth} + \raggedright% + \addressfont% + {\bfseries\upshape\@recipientname}\\% + \@recipientaddress% + \end{minipage} + % date + \hfill% US style +% \\[1em]% UK style + \@date\\[2em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900" + % opening + \raggedright% + \@opening\\[1.5em]% + % ensure no extra spacing after \makelettertitle due to a possible blank line +% \ignorespacesafterend% not working + \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}} + + +\endinput + + +%% end of file `moderncvheadi.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvheadii.sty b/public/lib/templates/template7/inputs/moderncvheadii.sty new file mode 100644 index 00000000..b699242e --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvheadii.sty @@ -0,0 +1,204 @@ +%% start of file `moderncvheadii.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvheadii}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 2] + +% details options: "details" or "nodetails" (default) +\@initializeif{\if@details}\@detailsfalse +\DeclareOption{details}{\@detailstrue} +\DeclareOption{nodetails}{\@detailsfalse} + +% name design options: "alternate" (lowercase names & title, no spacing) +\@initializeif{\if@alternate}\@alternatefalse +\DeclareOption{alternate}{\@alternatetrue} + +% left/right options: "left" or "right" (default) +\@initializeif{\if@left} \@leftfalse +\DeclareOption{left} {\@lefttrue\@rightfalse} +\@initializeif{\if@right}\@rightfalse +\DeclareOption{right} {\@leftfalse\@righttrue} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{nodetails,right} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- + + +%------------------------------------------------------------------------------- +% overall head definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\namefont}{\fontsize{38}{40}\mdseries\upshape} +\renewcommand*{\titlefont}{\LARGE\mdseries\slshape} +\renewcommand*{\addressfont}{\normalsize\mdseries\slshape} +\renewcommand*{\quotefont}{\large\slshape} + +% styles +\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color0}{#1}}} +\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2}{#1}}} +\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}} +\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}} + +% commands +\@initializecommand{\makeheaddetailssymbol}{% + {\hspace{1em}{\rmfamily\textbullet}\hspace{1em}}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n +% internal command to add an element to the footer +% it collects the elements in a temporary box, and checks when to flush the box +\@initializebox{\makeheaddetailsbox}% +\@initializebox{\makeheaddetailstempbox}% +\@initializelength{\makeheaddetailswidth}% +\@initializelength{\makeheaddetailsboxwidth}% +\@initializeif{\if@firstmakeheaddetailselement}\@firstmakeheaddetailselementtrue% +% adds an element to the makehead, separated by makeheadsymbol +% usage: \addtomakehead[makeheadsymbol]{element} +\newcommand*{\addtomakeheaddetails}[2][\makeheaddetailssymbol]{% TODO: use \@initializecommand, which requires modifying its definition to handle mandatory and optional arguments + \if@firstmakeheaddetailselement% + \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#2}% + \else% + \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#1#2}\fi% + \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailstempbox}}% + \ifnum\makeheaddetailsboxwidth<\makeheaddetailswidth% + \savebox{\makeheaddetailsbox}{\usebox{\makeheaddetailstempbox}}% + \@firstmakeheaddetailselementfalse% + \else% + \flushmakeheaddetails\\\null% \null is required as there is no box on the line after \\, so glue such as \hfill (and leaders) disappear; this is in contrast to after \par, where the next line starts with an indent box (even after \noindent) + \savebox{\makeheaddetailsbox}{#2}% + \savebox{\makeheaddetailstempbox}{#2}% + \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailsbox}}% + \@firstmakeheaddetailselementfalse\fi} +% internal command to flush the makehead +\@initializecommand{\flushmakeheaddetails}{% + \if@right\hfill\fi% + \strut\usebox{\makeheaddetailsbox}% + \savebox{\makeheaddetailsbox}{}% + \savebox{\makeheaddetailstempbox}{}% + \setlength{\makeheaddetailsboxwidth}{0pt}} + + +%------------------------------------------------------------------------------- +% resume head definition +%------------------------------------------------------------------------------- +% lengths +\@initializelength{\quotewidth} +\renewcommand*{\recomputecvheadlengths}{% + \setlength{\makeheaddetailswidth}{\textwidth}% + \setlength{\quotewidth}{0.65\textwidth}} + +% commands +\renewcommand*{\makecvhead}{% TODO: use \@initializecommand, which requires modifying its definition to handle \par + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputecvlengths% + % optional picture (pre-rendering) + \@initializebox{\makecvheadpicturebox}% + \savebox{\makecvheadpicturebox}{% + \ifthenelse{\isundefined{\@photo}}% + {}% + {% + \setlength\fboxrule{\@photoframewidth}% + \ifdim\@photoframewidth=0pt% + \setlength{\fboxsep}{0pt}\fi% + {\color{color1}\framebox{\includegraphics[width=\@photowidth]{\@photo}}}}}% + % name (pre-rendering) + \@initializelength{\makecvheadpicturewidth}% + \settowidth{\makecvheadpicturewidth}{\usebox{\makecvheadpicturebox}}% + \@initializebox{\makecvheadnamebox}% + \savebox{\makecvheadnamebox}{% + \parbox[b]{\textwidth-\makecvheadpicturewidth}{% + \if@left\raggedright\fi% + \if@right\raggedleft\fi% + \namefont% + \if@alternate% alternate design: first- and lastname in lowercase with no space in between (distinction is made by color difference) + {\color{color2!50}\MakeLowercase\@firstname}{\color{color2}\MakeLowercase\@lastname}% + \else% default design: first- and lastname as given with a space in between + {\color{color2!50}\@firstname} {\color{color2}\@lastname}\fi}}% + % rendering + \if@left% + \usebox{\makecvheadnamebox}% + \usebox{\makecvheadpicturebox}\fi + \if@right% + \usebox{\makecvheadpicturebox}% + \usebox{\makecvheadnamebox}\fi\\[-.35em]% + {\color{color2!50}\rule{\textwidth}{.25ex}}% + % optional detailed information + \if@details{% + \\\null% + \addressfont\color{color2}% + \ifthenelse{\isundefined{\@addressstreet}}{}{\addtomakeheaddetails{\addresssymbol\@addressstreet}% + \ifthenelse{\equal{\@addresscity}{}}{}{\addtomakeheaddetails[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\addtomakeheaddetails[~--~]{\@addresscountry}}% + \flushmakeheaddetails\@firstmakeheaddetailselementtrue\\\null}% + \ifthenelse{\isundefined{\@born}}{}{\addtomakeheaddetails{\bornsymbol\@born}}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \addtomakeheaddetails{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}% + \ifthenelse{\isundefined{\@email}}{}{\addtomakeheaddetails{\emailsymbol\emaillink{\@email}}}% + \ifthenelse{\isundefined{\@homepage}}{}{\addtomakeheaddetails{\homepagesymbol\httpslink{\@homepage}}}% + \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link + \addtomakeheaddetails{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}% + \ifthenelse{\isundefined{\@extrainfo}}{}{\addtomakeheaddetails{\@extrainfo}}% + \flushmakeheaddetails}\fi% need to force a \par after this to avoid weird spacing bug at the first section if no blank line is left after \makehead + % optional title + \ifthenelse{\equal{\@title}{}}{}{% + \\[1.25em]\null% \null is required as there is no box on the line after \\, so glue such as \hfill (and leaders) disappear; this is in contrast to after \par, where the next line starts with an indent box (even after \noindent) + \if@right\hfill\fi% + \if@alternate% + \titlestyle{\MakeLowercase\@title}% + \else% + \titlestyle{\@title}\fi% + }\\[2.5em]% + % optional quote + \ifthenelse{\isundefined{\@quote}}% + {}% + {{\null\hfill% + \begin{minipage}{\quotewidth}% + \centering% + \quotestyle{\@quote}% + \end{minipage}\hfill\null\\[2.5em]}}% + \par}% to avoid weird spacing bug at the first section if no blank line is left after \maketitle + + +%------------------------------------------------------------------------------- +% letter head definition +%------------------------------------------------------------------------------- +% lengths +%\renewcommand*{\recomputeletterheadlengths}{} + +% commands +\renewcommand*{\makeletterhead}{% + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputeletterlengths% + % recipient block + \begin{minipage}[t]{.5\textwidth} + \raggedright% + \addressfont% + {\bfseries\upshape\@recipientname}\\% + \@recipientaddress% + \end{minipage} + % date + \hfill% US style +% \\[1em]% UK style + \@date\\[2em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900" + % opening + \raggedright% + \@opening\\[1.5em]% + % ensure no extra spacing after \makelettertitle due to a possible blank line +% \ignorespacesafterend% not working + \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}} + + +\endinput + + +%% end of file `moderncvheadii.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvheadiii.sty b/public/lib/templates/template7/inputs/moderncvheadiii.sty new file mode 100644 index 00000000..e4dbafd5 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvheadiii.sty @@ -0,0 +1,160 @@ +%% start of file `moderncvheadiii.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvheadiii}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 3] + +% details options: "details" (default) or "nodetails" +\@initializeif{\if@details}\@detailsfalse +\DeclareOption{details}{\@detailstrue} +\DeclareOption{nodetails}{\@detailsfalse} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{details} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- + + +%------------------------------------------------------------------------------- +% overall head definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\namefont}{\Huge\bfseries\upshape} +\renewcommand*{\titlefont}{\Huge\mdseries\upshape} +\renewcommand*{\addressfont}{\normalsize\mdseries\upshape} +\renewcommand*{\quotefont}{\large\slshape} + +% styles +\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color1}{#1}}} +\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2!85}{#1}}} +\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}} +\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}} + +% commands +\@initializecommand{\makeheaddetailssymbol}{% + {\hspace{1em}{\rmfamily\textbullet}\hspace{1em}}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n +% internal command to add an element to the footer +% it collects the elements in a temporary box, and checks when to flush the box +\@initializebox{\makeheaddetailsbox}% +\@initializebox{\makeheaddetailstempbox}% +\@initializelength{\makeheaddetailswidth}% +\@initializelength{\makeheaddetailsboxwidth}% +\@initializeif{\if@firstmakeheaddetailselement}\@firstmakeheaddetailselementtrue% +% adds an element to the makehead, separated by makeheadsymbol +% usage: \addtomakehead[makeheadsymbol]{element} +\newcommand*{\addtomakeheaddetails}[2][\makeheaddetailssymbol]{% TODO: use \@initializecommand, which requires modifying its definition to handle mandatory and optional arguments + \if@firstmakeheaddetailselement% + \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#2}% + \else% + \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#1#2}\fi% + \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailstempbox}}% + \ifnum\makeheaddetailsboxwidth<\makeheaddetailswidth% + \savebox{\makeheaddetailsbox}{\usebox{\makeheaddetailstempbox}}% + \@firstmakeheaddetailselementfalse% + \else% + \flushmakeheaddetails\\% + \savebox{\makeheaddetailsbox}{#2}% + \savebox{\makeheaddetailstempbox}{#2}% + \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailsbox}}% + \@firstmakeheaddetailselementfalse\fi} +% internal command to flush the makehead +\@initializecommand{\flushmakeheaddetails}{% + \ifnum\makeheaddetailsboxwidth>0% + \strut\usebox{\makeheaddetailsbox}% + \savebox{\makeheaddetailsbox}{}% + \savebox{\makeheaddetailstempbox}{}% + \setlength{\makeheaddetailsboxwidth}{0pt}\fi} +\@initializecommand{\makehead}{% + \setlength{\makeheaddetailswidth}{0.8\textwidth}% + \hfil% + \parbox{\makeheaddetailswidth}{% + \centering% + % name and title + \namestyle{\@firstname~\@lastname}% + \ifthenelse{\equal{\@title}{}}{}{\titlestyle{~|~\@title}}% \isundefined doesn't work on \@title, as LaTeX itself defines \@title (before it possibly gets redefined by \title) + % optional detailed information + \if@details{% + \\% + \addressfont\color{color2}% + \ifthenelse{\isundefined{\@addressstreet}}{}{\addtomakeheaddetails{\addresssymbol\@addressstreet}% + \ifthenelse{\equal{\@addresscity}{}}{}{\addtomakeheaddetails[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\addtomakeheaddetails[~--~]{\@addresscountry}}% + \flushmakeheaddetails\@firstmakeheaddetailselementtrue\\}% + \ifthenelse{\isundefined{\@born}}{}{\addtomakeheaddetails{\bornsymbol\@born}}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \addtomakeheaddetails{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}% + \ifthenelse{\isundefined{\@email}}{}{\addtomakeheaddetails{\emailsymbol\emaillink{\@email}}}% + \ifthenelse{\isundefined{\@homepage}}{}{\addtomakeheaddetails{\homepagesymbol\httpslink{\@homepage}}}% + \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link + \addtomakeheaddetails{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}% + \ifthenelse{\isundefined{\@extrainfo}}{}{\addtomakeheaddetails{\@extrainfo}}% + \flushmakeheaddetails}\fi}\\[2.5em]}% need to force a \par after this to avoid weird spacing bug at the first section if no blank line is left after \makehead + + +%------------------------------------------------------------------------------- +% resume head definition +%------------------------------------------------------------------------------- +% lengths +\@initializelength{\quotewidth} +\renewcommand*{\recomputecvheadlengths}{% + \setlength{\quotewidth}{0.65\textwidth}} + +% commands +\renewcommand*{\makecvhead}{% TODO: use \@initializecommand, which requires modifying its definition to handle \par + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputecvlengths% + \makehead% + % optional quote + \ifthenelse{\isundefined{\@quote}}% + {}% + {{\centering\begin{minipage}{\quotewidth}\centering\quotestyle{\@quote}\end{minipage}\\[2.5em]}}% + \par}% to avoid weird spacing bug at the first section if no blank line is left after \maketitle} + + +%------------------------------------------------------------------------------- +% letter head definition +%------------------------------------------------------------------------------- +% lengths +%\renewcommand*{\recomputeletterheadlengths}{} + +% commands +\renewcommand*{\makeletterhead}{% + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputeletterlengths% + % sender block + \makehead% + \par% + % recipient block + \begin{minipage}[t]{.5\textwidth} + \raggedright% + \addressfont% + {\bfseries\upshape\@recipientname}\\% + \@recipientaddress% + \end{minipage} + % date + \hfill% US style +% \\[1em]% UK style + \@date\\[2em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900" + % opening + \raggedright% + \@opening\\[1.5em]% + % ensure no extra spacing after \makelettertitle due to a possible blank line +% \ignorespacesafterend% not working + \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}} + + +\endinput + + +%% end of file `moderncvheadiii.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvheadiv.sty b/public/lib/templates/template7/inputs/moderncvheadiv.sty new file mode 100644 index 00000000..9b59dacb --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvheadiv.sty @@ -0,0 +1,172 @@ +%% start of file `moderncvheadiv.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvheadiv}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 4] + +% details options: "details" (default) or "nodetails" +\@initializeif{\if@details}\@detailsfalse +\DeclareOption{details}{\@detailstrue} +\DeclareOption{nodetails}{\@detailsfalse} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{details} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +% change the layout of the page on the fly, for resume or letter layout +\RequirePackage{changepage} + + +%------------------------------------------------------------------------------- +% overall head definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\namefont}{\fontsize{34}{36}\mdseries\upshape} +\renewcommand*{\titlefont}{\LARGE\mdseries\slshape} +\renewcommand*{\addressfont}{\small\mdseries} +\renewcommand*{\quotefont}{\large\itshape} + +% styles +\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color0}{#1}}} +\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2}{#1}}} +\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}} +\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}} + + +%------------------------------------------------------------------------------- +% resume head definition +%------------------------------------------------------------------------------- +% lengths +\@initializelength{\quotewidth} +\@initializelength{\makecvheadnamewidth}% optional makecvheadname width to force a certain width (if set/remains to 0pt, the width is calculated automatically) +\setlength{\marginparwidth}{0\p@} +\setlength{\marginparsep}{0\p@} +\renewcommand*{\recomputecvheadlengths}{% + \changepage{}{+\marginparwidth+\marginparsep}{}{}{}{}{}{}{}% if a letter was typeset before the resume, \marginparwidth and \marginparsep will be non-zero; otherwise, this has no effect + \setlength{\marginparwidth}{0\p@}% + \setlength{\marginparsep}{0\p@}% + \setlength{\quotewidth}{0.85\textwidth}} + +% commands +\newcommand*{\makecvheadinfo}[1]{% TODO: use \@initializecommand, which requires modifying its definition to handle mandatory and optional arguments + \newbox{\makecvheadinfobox}% + \savebox{\makecvheadinfobox}{\parbox[t]{\hintscolumnwidth}{#1}}% + \newlength{\makecvheadinfoheight}% + \setlength{\makecvheadinfoheight}{\totalheightof{\usebox{\makecvheadinfobox}}}% the total height of the parbox is the sum of its height (\the\ht\makeinfobox) and its depth (\the\dp\makeinfobox); the \totalheightof command is provided by the "calc" package + \usebox{\makecvheadinfobox}\vspace{-\makecvheadinfoheight}% +% \newlength{\leftcolumnwidth}% +% \setlength{\leftcolumnwidth}{\hintscolumnwidth+\separatorcolumnwidth}% +% \par\vspace{-\baselineskip}\vspace{-\parskip}\leftskip=\leftcolumnwidth% + \par\vspace{-\baselineskip}\vspace{-\parskip}% + \leftskip=\dimexpr\hintscolumnwidth+\separatorcolumnwidth\relax% \dimexpr require e-TeX engine extensions + \recomputecvlengths} % need to recompute the layout lenghts as we just changed \leftskip +\renewcommand*{\makecvhead}{ + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputecvlengths% + % optional picture box + \newbox{\makecvheadpicturebox}% + \savebox{\makecvheadpicturebox}{% + \ifthenelse{\isundefined{\@photo}}% + {}% + {% + \color{color1}% + \setlength\fboxrule{\@photoframewidth}% + \ifdim\@photoframewidth=0pt% + \setlength{\fboxsep}{0pt}\fi% + \framebox{\includegraphics[width=\@photowidth]{\@photo}}}}% + % name and optional title + \newlength{\makecvheadpicturewidth}\settowidth{\makecvheadpicturewidth}{\usebox{\makecvheadpicturebox}}% + \ifthenelse{\lengthtest{\makecvheadnamewidth=0pt}}% check for dummy value (equivalent to \ifdim\makecvheadnamewidth=0pt) + {\setlength{\makecvheadnamewidth}{\textwidth-\makecvheadpicturewidth}}% + {}% + \begin{minipage}[b]{\makecvheadnamewidth}% + \namestyle{\@firstname\ \@lastname}% + \ifthenelse{\equal{\@title}{}}{}{\\[1.25em]\titlestyle{\@title}}% + \end{minipage}% + % optional photo + \usebox{\makecvheadpicturebox}\\[2.5em]% + % optional quote + \ifthenelse{\isundefined{\@quote}}% + {}% + {{\centering\begin{minipage}{\quotewidth}\centering\quotestyle{\@quote}\end{minipage}\\[2.5em]}}% + % optional details + \if@details% + \makecvheadinfo{% + \addressfont\color{color2}% + \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet% + \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}% + \ifthenelse{\isundefined{\@born}}{}{\makenewline\hbox to 1.0em{\bornsymbol}~\@born}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \makenewline\hbox to 1.0em{\csname\collectionloopkey phonesymbol\endcsname}~\collectionloopitem}% + \ifthenelse{\isundefined{\@email}}{}{\makenewline\hbox to 1.0em{\emailsymbol}~\emaillink{\@email}}% + \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\hbox to 1.0em{\homepagesymbol}~\httpslink{\@homepage}}% + \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link + \makenewline\hbox to 1.0em{\csname\collectionloopkey socialsymbol\endcsname}~\collectionloopitem}% + \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}}\fi} + + +%------------------------------------------------------------------------------- +% letter head definition +%------------------------------------------------------------------------------- +% lengths +%\newlength{\textwidthdelta}% +\renewcommand*{\recomputeletterheadlengths}{% + \recomputecvlengths% +% \setlength{\textwidthdelta}{+\marginparwidth+\marginparsep}% +% \addtolength{\textwidthdelta}{-\marginparwidth-\marginparsep}% +% \changepage{}{\textwidthdelta}{-\textwidthdelta}{}{}{}{}{}{}%\changepage{<textheight>}{<textwidth>}{<evensidemargin>}{<oddsidemargin>}{<columnsep>}{<topmargin>}{<headheight>}{<headsep>}{<footskip>} + \setlength{\marginparwidth}{\hintscolumnwidth}% + \setlength{\marginparsep}{2\separatorcolumnwidth}% + \changepage{}{-\marginparwidth-\marginparsep}{}{}{}{}{}{}{}%\changepage{<textheight>}{<textwidth>}{<evensidemargin>}{<oddsidemargin>}{<columnsep>}{<topmargin>}{<headheight>}{<headsep>}{<footskip>} + } + +% commands +\renewcommand*{\makeletterhead}{% + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \leftskip=0pt% needs to be set before \recomputeletterlengths + \recomputeletterlengths% + % recipient block + {\addressfont% + {\bfseries\upshape\@recipientname}\\% + \@recipientaddress}\\[1em]% + % date + \@date\\[2em]% + % opening + \@opening\\[1.5em]% + % sender contact info + \if@details% + \hspace{0pt}% + \marginpar{% + \addressfont\textcolor{color2}{% + {\bfseries\@firstname~\@lastname}\@firstdetailselementfalse% + \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet% + \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \makenewline\hbox to 1.0em{\csname\collectionloopkey phonesymbol\endcsname}~\collectionloopitem}% + \ifthenelse{\isundefined{\@email}}{}{\makenewline\hbox to 1.0em{\emailsymbol}~\emaillink{\@email}}% + \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\hbox to 1.0em{\homepagesymbol}~\httpslink{\@homepage}}% + \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link + \makenewline\hbox to 1.0em{\csname\collectionloopkey socialsymbol\endcsname}~\collectionloopitem}% + \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}}}% + % ensure no extra spacing after \makelettertitle due to a possible blank line + %\ignorespacesafterend% not working + \par\vspace{-\baselineskip}\vspace{-\parskip}\fi} + + +\endinput + + +%% end of file `moderncvheadiv.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvheadv.sty b/public/lib/templates/template7/inputs/moderncvheadv.sty new file mode 100644 index 00000000..c4d40843 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvheadv.sty @@ -0,0 +1,174 @@ +%% start of file `moderncvheadv.sty'. +%% Copyright 2015-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvheadv}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 5] + +% details options: "details" (default) or "nodetails" +\@initializeif{\if@details}\@detailsfalse +\DeclareOption{details} {\@detailstrue} +\DeclareOption{nodetails} {\@detailsfalse} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{details} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- + + +%------------------------------------------------------------------------------- +% overall head definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\namefont}{\fontsize{34}{36}\mdseries\upshape} +\renewcommand*{\titlefont}{\LARGE\mdseries\slshape} +\renewcommand*{\addressfont}{\small\mdseries\slshape} +\renewcommand*{\quotefont}{\large\slshape} + +% styles +\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color0}{#1}}} +\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2}{#1}}} +\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}} +\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}} + + +%------------------------------------------------------------------------------- +% resume head definition +%------------------------------------------------------------------------------- +% lengths +\@initializelength{\quotewidth} +\renewcommand*{\recomputecvheadlengths}{% + \setlength{\quotewidth}{0.65\textwidth}} + +% commands +\renewcommand*{\makecvhead}{% + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputecvlengths% + % optional photo (pre-rendering) + \@initializebox{\makecvheadpicturebox}% + \savebox{\makecvheadpicturebox}{% + \ifthenelse{\isundefined{\@photo}}% + {}% + {% + \color{color1}% + \setlength{\fboxrule}{\@photoframewidth}% + \ifdim\@photoframewidth=0pt% + \setlength{\fboxsep}{0pt}\fi% + \framebox{\includegraphics[width=\@photowidth]{\@photo}}}}% + % rendering + \@makecvtitle% + {% + \raggedleft% + % optional photo + \usebox{\makecvheadpicturebox}% + % optional details + \if@details% + \ifthenelse{\isundefined{\@photo}}{}{\\[0.5em]}% + \addressfont\color{color2}% + \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet% + \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}% + \ifthenelse{\isundefined{\@born}}{}{\makenewline\bornsymbol~\@born}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \makenewline\csname\collectionloopkey phonesymbol\endcsname~\collectionloopitem}% + \ifthenelse{\isundefined{\@email}}{}{\makenewline\emailsymbol~\emaillink{\@email}}% + \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\homepagesymbol~\httpslink{\@homepage}}% + \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link + \makenewline\csname\collectionloopkey socialsymbol\endcsname~\collectionloopitem}% + \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}\fi}% + {% + % name and optional title + \newlength{\makecvheadpictureboxskip}% + \setlength{\makecvheadpictureboxskip}{\totalheightof{\usebox{\makecvheadpicturebox}}}% + \namestyle{\@firstname\ \@lastname}% + \ifthenelse{\equal{\@title}{}}{ + \ifthenelse{\isundefined{\@quote}}% + {}% + {\\[1.25em]\begin{minipage}{\quotewidth}\quotestyle{\@quote}\end{minipage}\\[2.5em]} + }{ + \\[1.25em]\titlestyle{\@title}\\[2.5em]% + % optional quote + \ifthenelse{\isundefined{\@quote}}% + {}% + {\begin{minipage}{\quotewidth}\quotestyle{\@quote}\end{minipage}\\[2.5em]}}}% + \par}% to avoid weird spacing bug at the first section if no blank line is left after \makecvhead + +% underlying command to implement \makecvtitle, identical to \@cvitem from moderncvbodyv +\let\standarddoublebackslash\\% +\newcommand*{\@makecvtitle}[3][.5ex]{% + \arrayrulecolor{color1}% + \setlength\arrayrulewidth{1.2\p@}% + \if@aftersection\else% + \vspace*{-\arrayrulewidth}\fi% HACK; I don't understand where the space is coming from, nor what it's exact value is :( + \noindent% + \begin{tabular}[t]{@{}p{\hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}p{\maincolumnwidth}@{}}% + \@moderncvstrut{4pt}{16pt}% + \begin{minipage}[t]{\hintscolumnwidth}#2\end{minipage} + &\begin{minipage}[t]{\maincolumnwidth}#3\end{minipage}% + \\[#1]% the spacing needs to be inside the cell for the vertical rule to extend correctly + \end{tabular}% + \par\@aftersectionfalse\ignorespaces} + + +%------------------------------------------------------------------------------- +% letter head definition +%------------------------------------------------------------------------------- +% lengths +%\renewcommand*{\recomputeletterheadlengths}{} + +% commands +\renewcommand*{\makeletterhead}{% + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputeletterlengths% + % sender contact info + \hfill% + \begin{minipage}{.5\textwidth}% + % optional detailed information + \if@details% + \raggedleft% + \addressfont\textcolor{color2}{% + {\bfseries\upshape\@firstname~\@lastname}\@firstdetailselementfalse% + % optional detailed information + \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet% + \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \makenewline\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}% + \ifthenelse{\isundefined{\@email}}{}{\makenewline\emailsymbol\emaillink{\@email}}% + \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\homepagesymbol\httpslink{\@homepage}}% + \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}}\fi% + \end{minipage}\\[1em] + % recipient block + \begin{minipage}[t]{.5\textwidth} + \raggedright% + \addressfont% + {\bfseries\upshape\@recipientname}\\% + \@recipientaddress% + \end{minipage} + % date + \hfill% US style +% \\[1em]% UK style + \@date\\[2em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900" + % opening + \raggedright% + \@opening\\[1.5em]% + % ensure no extra spacing after \makelettertitle due to a possible blank line +% \ignorespacesafterend% not working + \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}} + + +\endinput + + +%% end of file `moderncvheadv.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvheadvi.sty b/public/lib/templates/template7/inputs/moderncvheadvi.sty new file mode 100644 index 00000000..85959019 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvheadvi.sty @@ -0,0 +1,169 @@ +%% start of file `moderncvheadvi.sty'. +%% Copyright 2015-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvheadvi}[2022-02-21 v2.3.1 modern curriculum vitae and letter header: 6] + +% details options: "details" (default) or "nodetails" +\@initializeif{\if@details}\@detailsfalse +\DeclareOption{details}{\@detailstrue} +\DeclareOption{nodetails}{\@detailsfalse} + +% left/right options: "left" (default) or "right" +\@initializeif{\if@left} \@leftfalse +\DeclareOption{left} {\@lefttrue\@rightfalse} +\@initializeif{\if@right}\@rightfalse +\DeclareOption{right} {\@leftfalse\@righttrue} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{details, left} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- + + +%------------------------------------------------------------------------------- +% overall head definition +%------------------------------------------------------------------------------- +% fonts +\renewcommand*{\namefont}{\Huge\bfseries\upshape} +\renewcommand*{\titlefont}{\Huge\mdseries\upshape} +\renewcommand*{\addressfont}{\normalsize\mdseries\upshape} +\renewcommand*{\quotefont}{\large\slshape} + +% styles +\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color1}{#1}}} +\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2!85}{#1}}} +\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}} +\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}} + +% commands +\@initializecommand{\makehead}{% + \setlength{\makeheaddetailswidth}{\textwidth}% + % name and title + \if@left\hfill\fi% + \namestyle{\@firstname~\@lastname}% + \ifthenelse{\equal{\@title}{}}{}{\titlestyle{~|~\@title}}\\[-.35em]% \isundefined doesn't work on \@title, as LaTeX itself defines \@title (before it possibly gets redefined by \title) + % rule + {\color{color1}\rule{\textwidth}{.25ex}}} + +%------------------------------------------------------------------------------- +% resume head definition +%------------------------------------------------------------------------------- +% lengths +\@initializelength{\quotewidth} +\renewcommand*{\recomputecvheadlengths}{% + \setlength{\quotewidth}{0.65\textwidth}} + +% commands +\@initializecommand{\makeheaddetailssymbol}{% + {\hspace{1em}{\rmfamily\textbullet}\hspace{1em}}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n +% internal command to add an element to the footer +% it collects the elements in a temporary box, and checks when to flush the box +\@initializebox{\makeheaddetailsbox}% +\@initializebox{\makeheaddetailstempbox}% +\@initializelength{\makeheaddetailswidth}% +\@initializelength{\makeheaddetailsboxwidth}% +\@initializeif{\if@firstmakeheaddetailselement}\@firstmakeheaddetailselementtrue% +% adds an element to the makehead, separated by makeheadsymbol +% usage: \addtomakehead[makeheadsymbol]{element} +\newcommand*{\addtomakeheaddetails}[2][\makeheaddetailssymbol]{% TODO: use \@initializecommand, which requires modifying its definition to handle mandatory and optional arguments + \if@firstmakeheaddetailselement% + \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#2}% + \else% + \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#1#2}\fi% + \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailstempbox}}% + \ifnum\makeheaddetailsboxwidth<\makeheaddetailswidth% + \savebox{\makeheaddetailsbox}{\usebox{\makeheaddetailstempbox}}% + \@firstmakeheaddetailselementfalse% + \else% + \flushmakeheaddetails\\\null% \null is required as there is no box on the line after \\, so glue such as \hfill (and leaders) disappear; this is in contrast to after \par, where the next line starts with an indent box (even after \noindent) + \savebox{\makeheaddetailsbox}{#2}% + \savebox{\makeheaddetailstempbox}{#2}% + \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailsbox}}% + \@firstmakeheaddetailselementfalse\fi} +% internal command to flush the makehead +\@initializecommand{\flushmakeheaddetails}{% + \if@right\hfill\fi% + \strut\usebox{\makeheaddetailsbox}% + \savebox{\makeheaddetailsbox}{}% + \savebox{\makeheaddetailstempbox}{}% + \setlength{\makeheaddetailsboxwidth}{0pt}} +\renewcommand*{\makecvhead}{% TODO: use \@initializecommand, which requires modifying its definition to handle \par + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputecvlengths% + \makehead% + % optional detailed information + \if@details{% + \\\null% + \addressfont\color{color2}% + \ifthenelse{\isundefined{\@addressstreet}}{}{\addtomakeheaddetails{\addresssymbol\@addressstreet}% + \ifthenelse{\equal{\@addresscity}{}}{}{\addtomakeheaddetails[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty + \ifthenelse{\equal{\@addresscountry}{}}{}{\addtomakeheaddetails[~--~]{\@addresscountry}}% + \flushmakeheaddetails\@firstmakeheaddetailselementtrue\\\null}% + \ifthenelse{\isundefined{\@born}}{}{\addtomakeheaddetails{\bornsymbol\@born}}% + \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number + \addtomakeheaddetails{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}% + \ifthenelse{\isundefined{\@email}}{}{\addtomakeheaddetails{\emailsymbol\emaillink{\@email}}}% + \ifthenelse{\isundefined{\@homepage}}{}{\addtomakeheaddetails{\homepagesymbol\httpslink{\@homepage}}}% + \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link + \addtomakeheaddetails{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}% + \ifthenelse{\isundefined{\@extrainfo}}{}{\addtomakeheaddetails{\@extrainfo}}% + \flushmakeheaddetails}\fi% need to force a \par after this to avoid weird spacing bug at the first section if no blank line is left after \makehead; not forcing it here because of the possible quote + % optional quote + \ifthenelse{\isundefined{\@quote}}% + {}% + {{\\[1.25em]\null\hfill% + \begin{minipage}{\quotewidth}% + \centering\quotestyle{\@quote}% + \end{minipage}\hfill\null}}\\[2.5em]% + \par}% to avoid weird spacing bug at the first section if no blank line is left after \maketitle} + + +%------------------------------------------------------------------------------- +% letter head definition +%------------------------------------------------------------------------------- +% lengths +%\renewcommand*{\recomputeletterheadlengths}{} + +% commands +\renewcommand*{\makeletterhead}{% + % recompute lengths (in case we are switching from letter to resume, or vice versa) + \recomputeletterlengths% + % sender block + \makehead\\[2.5em]% + \par% to avoid weird spacing bug at the first section if no blank line is left after \maketitle} + % recipient block + \begin{minipage}[t]{.5\textwidth} + \raggedright% + \addressfont% + {\bfseries\upshape\@recipientname}\\% + \@recipientaddress% + \end{minipage} + % date + \hfill% US style +% \\[1em]% UK style + \@date\\[2em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900" + % opening + \raggedright% + \@opening\\[1.5em]% + % ensure no extra spacing after \makelettertitle due to a possible blank line +% \ignorespacesafterend% not working + \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}} + + +\endinput + + +%% end of file `moderncvheadvi.sty'. diff --git a/public/lib/templates/template7/inputs/moderncviconsacademic.sty b/public/lib/templates/template7/inputs/moderncviconsacademic.sty new file mode 100644 index 00000000..e1eae589 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncviconsacademic.sty @@ -0,0 +1,54 @@ +%% start of file `moderncviconsacademic.sty'. +%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncviconsacademic}[2022-02-21 v2.3.1 modern curriculum vitae icons: academicons] + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +% Package for academic icons +\RequirePackage{academicons} + + +%------------------------------------------------------------------------------- +% all symbols described in moderncv.cls +%------------------------------------------------------------------------------- +%\newcommand*{\listitemsymbol} {\labelitemi~} +%\newcommand*{\addresssymbol} {} +%\newcommand*{\bornsymbol} {} +%\newcommand*{\mobilephonesymbol} {} +%\newcommand*{\fixedphonesymbol} {} +%\newcommand*{\faxphonesymbol} {} +%\newcommand*{\emailsymbol} {} +%\newcommand*{\homepagesymbol} {} +%\newcommand*{\linkedinsocialsymbol} {} +%\newcommand*{\xingsocialsymbol} {} +%\newcommand*{\twittersocialsymbol} {} +%\newcommand*{\githubsocialsymbol} {} +%\newcommand*{\gitlabsocialsymbol} {} +%\newcommand*{\stackoverflowsocialsymbol}{} +%\newcommand*{\bitbucketsocialsymbol} {} +%\newcommand*{\skypesocialsymbol} {} +\renewcommand*{\orcidsocialsymbol} {{\small\aiOrcid}~} +\renewcommand*{\researchgatesocialsymbol} {{\small\aiResearchGateSquare}~} % alternative: \aiResearchGate +\renewcommand*{\researcheridsocialsymbol} {{\small\aiResearcherIDSquare}~} % alternative: \aiResearcherID +\renewcommand*{\googlescholarsocialsymbol}{{\small\aiGoogleScholar}~} +%\newcommand*{\telegramsocialsymbol} {} +%\newcommand*{\whatsappsocialsymbol} {} +%\newcommand*{\matrixsocialsymbol} {} +%\newcommand*{\signalsocialsymbol} {} + + +\endinput + +%% end of file `moderncviconsacademic.sty'. diff --git a/public/lib/templates/template7/inputs/moderncviconsawesome.sty b/public/lib/templates/template7/inputs/moderncviconsawesome.sty new file mode 100644 index 00000000..2a0ea3a2 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncviconsawesome.sty @@ -0,0 +1,57 @@ +%% start of file `moderncviconsawesome.sty'. +%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncviconsawesome}[2022-02-21 v2.3.1 modern curriculum vitae icons: awesome] + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +% Font Awesome font +\RequirePackage{fontawesome5} + +%------------------------------------------------------------------------------- +% all symbols described in moderncv.cls +%------------------------------------------------------------------------------- +\renewcommand*{\labelitemi} {\strut\textcolor{color1}{\tiny\faCircle[regular]}} % alternative: \faCircle (solid style) +%\renewcommand*{\labelitemii} {\strut\textcolor{color1}{\large\bfseries-}} % no change from default in moderncv.cls +%\renewcommand*{\labelitemiii} {\strut\textcolor{color1}{\rmfamily\textperiodcentered}}% no change from default in moderncv.cls +%\renewcommand*{\labelitemiv} {\labelitemiii} % no change from default in moderncv.cls + + +%\renewcommand*{\addresssymbol} {} +\renewcommand*{\mobilephonesymbol} {{\small\faMobile*}~} % alternative: \faMobile (solid style) +\renewcommand*{\fixedphonesymbol} {{\small\faPhone*}~} % alternative: \faPhone (reversed) +\renewcommand*{\faxphonesymbol} {{\small\faFax}~} % alternative: \faPrint +\renewcommand*{\emailsymbol} {{\small\faEnvelope[regular]}~} % alternative: \faInbox, \faEnvelope (solid style) +\renewcommand*{\homepagesymbol} {{\small\faGlobeAmericas}~} % alternative: \faHome, \faGlobe, \faGlobeEurope, \faGlobeAfrica, \faGlobeAsia +\renewcommand*{\linkedinsocialsymbol} {{\small\faLinkedinIn}~} % alternative: \faLinkedin +\renewcommand*{\xingsocialsymbol} {{\small\faXing}~} % alternative: \faXingSquare +\renewcommand*{\twittersocialsymbol} {{\small\faTwitter}~} % alternative: \faTwitterSquare +\renewcommand*{\githubsocialsymbol} {{\small\faGithub}~} % alternative: \faGithubSquare, \faGithub* +\renewcommand*{\gitlabsocialsymbol} {{\small\faGitlab}~} +\renewcommand*{\stackoverflowsocialsymbol}{{\small\faStackOverflow}~} +\renewcommand*{\bitbucketsocialsymbol} {{\small\faBitbucket}~} +\renewcommand*{\skypesocialsymbol} {{\small\faSkype}~} +\renewcommand*{\orcidsocialsymbol} {{\small\faOrcid}~} +\renewcommand*{\researchgatesocialsymbol} {{\small\faResearchgate}~} +%\renewcommand*{\researcheridsocialsymbol} {} +%\renewcommand*{\googlescholarsocialsymbol}{} +\renewcommand*{\telegramsocialsymbol} {{\small\faTelegram}~} +\renewcommand*{\whatsappsocialsymbol} {{\small\faWhatsapp}~} +%\renewcommand*{\signalsocialsymbol} {} +%\renewcommand*{\matrixsocialsymbol} {} +\renewcommand*{\bornsymbol} {{\small\faAsterisk}~} % alternative: \faBabyCarriage + +\endinput + + +%% end of file `moderncviconsawesome.sty'. diff --git a/public/lib/templates/template7/inputs/moderncviconsletters.sty b/public/lib/templates/template7/inputs/moderncviconsletters.sty new file mode 100644 index 00000000..832e2103 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncviconsletters.sty @@ -0,0 +1,55 @@ +%% start of file `moderncviconsletters.sty'. +%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncviconsletters}[2022-02-21 v2.3.1 modern curriculum vitae icons: letter] + +%------------------------------------------------------------------------------- +% symbols definition +%------------------------------------------------------------------------------- +\newcommand*{\marvosymbol}[1]{{\fontfamily{mvs}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\char#1}} + +\renewcommand*{\labelitemi} {\strut\textcolor{color1}{\marvosymbol{123}}} % equivalent to \Neutral from marvosym package; alternative: \fontencoding{U}\fontfamily{ding}\selectfont\tiny\symbol{'102} +%\renewcommand*{\labelitemii} {\strut\textcolor{color1}{\large\bfseries-}} % no change from default in moderncv.cls +%\renewcommand*{\labelitemiii} {\strut\textcolor{color1}{\rmfamily\textperiodcentered}}% no change from default in moderncv.cls +%\renewcommand*{\labelitemiv} {\labelitemiii} % no change from default in moderncv.cls + +\renewcommand*{\addresssymbol} {} +\renewcommand*{\mobilephonesymbol} {\textbf{M}~} +\renewcommand*{\fixedphonesymbol} {\textbf{T}~} +\renewcommand*{\faxphonesymbol} {\textbf{F}~} +\renewcommand*{\emailsymbol} {\textbf{E}~} +\renewcommand*{\homepagesymbol} {\textbf{W}~} +\renewcommand*{\linkedinsocialsymbol} {\textbf{in}~} +\renewcommand*{\xingsocialsymbol} {\textbf{xi}~} +\renewcommand*{\twittersocialsymbol} {\textbf{tw}~} +\renewcommand*{\githubsocialsymbol} {\textbf{gh}~} +\renewcommand*{\gitlabsocialsymbol} {\textbf{gl}~} +\renewcommand*{\stackoverflowsocialsymbol}{\textbf{so}~} +\renewcommand*{\bitbucketsocialsymbol} {\textbf{bb}~} +\renewcommand*{\skypesocialsymbol} {\textbf{sk}~} +\renewcommand*{\orcidsocialsymbol} {\textbf{orcid}~} +\renewcommand*{\researchgatesocialsymbol} {\textbf{rg}~} +\renewcommand*{\researcheridsocialsymbol} {\textbf{ri}~} +\renewcommand*{\telegramsocialsymbol} {\textbf{tg}~} +\renewcommand*{\whatsappsocialsymbol} {\textbf{wa}~} +\renewcommand*{\signalsocialsymbol} {\textbf{si}~} +\renewcommand*{\matrixsocialsymbol} {\textbf{ma}~} +\renewcommand*{\googlescholarsocialsymbol}{\textbf{gs}~} +\renewcommand*{\bornsymbol} {\textbf{B}~} + +\renewcommand*{\listitemsymbol} {\labelitemi~} + + +\endinput + + +%% end of file `moderncviconsletters.sty'. diff --git a/public/lib/templates/template7/inputs/moderncviconsmarvosym.sty b/public/lib/templates/template7/inputs/moderncviconsmarvosym.sty new file mode 100644 index 00000000..0a1d8f10 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncviconsmarvosym.sty @@ -0,0 +1,31 @@ +%% start of file `moderncviconsmarvosym.sty'. +%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncviconsmarvosym}[2022-02-21 v2.3.1 modern curriculum vitae icons: marvosym] + +%------------------------------------------------------------------------------- +% all symbols described in moderncv.cls +%------------------------------------------------------------------------------- +\newcommand*{\marvosymbol}[1]{{\fontfamily{mvs}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\char#1}} + +\renewcommand*{\labelitemi} {\strut\textcolor{color1}{\marvosymbol{123}}} % equivalent to \Neutral from marvosym package; alternative: \fontencoding{U}\fontfamily{ding}\selectfont\tiny\symbol{'102} + +\renewcommand*{\mobilephonesymbol} {\marvosymbol{72}~} +\renewcommand*{\fixedphonesymbol} {\marvosymbol{84}~} +\renewcommand*{\faxphonesymbol} {\marvosymbol{117}~} +\renewcommand*{\emailsymbol} {\marvosymbol{66}~} +\renewcommand*{\homepagesymbol} {{\Large\marvosymbol{205}}~} + +\endinput + + +%% end of file `moderncviconsmarvosym.sty'. diff --git a/public/lib/templates/template7/inputs/moderncviconssymbols.sty b/public/lib/templates/template7/inputs/moderncviconssymbols.sty new file mode 100644 index 00000000..25630438 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncviconssymbols.sty @@ -0,0 +1,33 @@ +%% start of file `moderncviconssymbols.sty'. +%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncviconssymbols}[2021-12-12 v2.2.0 modern curriculum vitae icons selector] + + +\ifxetexorluatex + \RequirePackage{moderncviconsawesome} + \RequirePackage{moderncviconsacademic} +\else + \ClassWarningNoLine{moderncv}{"academicons requires xetex/luatex to work. Using alternatives."} + \ifpdftex + \RequirePackage{moderncviconsawesome} + \else + \RequirePackage{moderncviconsmarvosym} + \fi +\fi + +% Define symbols that are not defined at this level +\RequirePackage{moderncviconstikz} + +\endinput + +%% end of file `moderncviconssymbols.sty'. diff --git a/public/lib/templates/template7/inputs/moderncviconstikz.sty b/public/lib/templates/template7/inputs/moderncviconstikz.sty new file mode 100644 index 00000000..c3e9f40b --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncviconstikz.sty @@ -0,0 +1,445 @@ +%% start of file `moderncviconstikz.sty'. +%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncviconstikz}[2022-02-21 v2.3.1 modern curriculum vitae and letter icons: tickz] + + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +\RequirePackage{tikz} +\RequirePackage{etoolbox} + + +%------------------------------------------------------------------------------- +% all symbols described in moderncv.cls +% only redefine symbols that are not defined at this level +%------------------------------------------------------------------------------- +\ifdefempty{\linkedinsocialsymbol} { + \renewcommand*{\linkedinsocialsymbol} { + \protect\raisebox{-0.165em}{ + \protect\begin{tikzpicture}[x=0.08em, y=0.08em, xscale=0.25, yscale=-0.25, inner sep=0pt, outer sep=0pt] + \protect\begin{scope}[cm={{0.60,0.0,0.0,0.60,(346.39,123.07)}}] + \protect\path[fill=color2] + (381,202) -- (434,202) .. controls (439,202) and (442,205) .. + (442,210) -- (442,264) .. controls (442,268) and (439,272) .. + (434,272) -- (381,272) .. controls (376,272) and (372,268) .. + (372,264) -- (372,210) .. controls (372,205) and (376,202) .. + (381,202) -- cycle; + \protect\begin{scope}[xscale=0.98, yscale=1.02, fill=white] + \protect\path[fill=white] + (403,253) -- (403,224) -- (394,224) -- (394,253) -- + cycle(398,211) .. controls (397,211) and (395,212) .. + (395,213) .. controls (394,213) and (393,215) .. + (393,216) .. controls (393,217) and (394,218) .. + (395,219) .. controls (395,220) and (397,220) .. + (398,220) .. controls (400,220) and (401,220) .. + (402,219) .. controls (402,218) and (403,217) .. + (403,216) .. controls (403,215) and (402,213) .. + (402,213) .. controls (401,212) and (400,211) .. + (398,211) -- cycle; + \protect\path[fill=white] + (410,253) -- (419,253) -- + (419,236) .. controls (419,236) and (419,235) .. + (419,235) .. controls (419,235) and (419,234) .. + (419,234) .. controls (419,233) and (420,232) .. + (421,232) .. controls (422,231) and (423,231) .. + (424,231) .. controls (425,231) and (427,231) .. + (427,232) .. controls (428,234) and (428,235) .. + (428,237) -- (428,253) -- (437,253) -- + (437,236) .. controls (437,232) and (436,228) .. + (434,226) .. controls (433,224) and (430,223) .. + (427,223) .. controls (425,223) and (423,224) .. + (421,225) .. controls (420,226) and (419,227) .. + (418,228) -- (418,228) -- (417,224) -- + (410,224) .. controls (410,225) and (410,227) .. + (410,228) .. controls (410,230) and (410,231) .. + (410,233) -- cycle; + \protect\end{scope} + \protect\end{scope} + \protect\end{tikzpicture}} + ~} +}{}\par + +\ifdefempty{\twittersocialsymbol} { + \renewcommand*{\twittersocialsymbol} { + \protect\raisebox{0em}{% + \protect\begin{tikzpicture}[x=0.08em, y=0.08em, xscale=0.005, yscale=-0.005, inner sep=0pt, outer sep=0pt] + \protect\path[fill=color2] + (2000, 192) .. controls (1926, 225) and (1847, 247) .. + (1764, 257) .. controls (1849, 206) and (1914, 126) .. + (1945, 30) .. controls (1865, 77) and (1778, 111) .. + (1684, 130) .. controls (1609, 50) and (1503, 0) .. + (1385, 0) .. controls (1158, 0) and ( 974, 184) .. + ( 974, 410) .. controls ( 974, 442) and ( 978, 474) .. + ( 985, 504) .. controls ( 644, 487) and ( 342, 323) .. + ( 139, 75) .. controls ( 104, 136) and ( 84, 206) .. + ( 84, 281) .. controls ( 84, 424) and ( 156, 549) .. + ( 266, 623) .. controls ( 199, 621) and ( 136, 602) .. + ( 80, 572) .. controls ( 80, 573) and ( 80, 575) .. + ( 80, 577) .. controls ( 80, 776) and ( 222, 941) .. + ( 409, 979) .. controls ( 375, 988) and ( 339, 993) .. + ( 301, 993) .. controls ( 275, 993) and ( 249, 991) .. + ( 224, 986) .. controls ( 276,1149) and ( 428,1268) .. + ( 607,1271) .. controls ( 467,1381) and ( 290,1447) .. + ( 98,1447) .. controls ( 65,1447) and ( 32,1445) .. + ( 0,1441) .. controls ( 182,1557) and ( 397,1625) .. + ( 629,1625) .. controls (1384,1625) and (1796,1000) .. + (1796, 458) .. controls (1796, 440) and (1796, 422) .. + (1795, 405) .. controls (1875, 347) and (1945, 275) .. + (2000, 192); + \protect\end{tikzpicture}} + ~} +}{}\par + +\ifdefempty{\githubsocialsymbol} { + \renewcommand*{\githubsocialsymbol} { + \protect\raisebox{-0.15em} { + \protect\begin{tikzpicture}[x=0.08em, y=0.08em, xscale=0.25, yscale=-0.25, inner sep=0pt, outer sep=0pt] + \protect\begin{scope}[shift={(507,387)}] + \protect\path[fill=color2] + (117, 60) .. controls (117, 71) and (108, 81) .. + ( 96, 81) .. controls ( 85, 81) and ( 75, 71) .. + ( 75, 60) .. controls ( 75, 48) and ( 85, 39) .. + ( 96, 39) .. controls (108, 39) and (117, 48) .. + (117, 60) -- cycle; + \protect\path[cm={{0.88,0.0,0.0,0.88,(11.10,6.89)}}, fill=white] + (117, 60) .. controls (117, 71) and (108, 81) .. + ( 96, 81) .. controls ( 85, 81) and ( 75, 71) .. + ( 75, 60) .. controls ( 75, 48) and ( 85, 39) .. + ( 96, 39) .. controls (108, 39) and (117, 48) .. + (117, 60) -- cycle; + \protect\path[fill=color2, nonzero rule] + (103, 45) .. controls (103, 45) and (101, 46) .. + (101, 47) -- (100, 47) -- + ( 99, 47) .. controls ( 99, 47) and ( 98, 47) .. + ( 97, 47) .. controls ( 94, 47) and ( 93, 47) .. + ( 92, 47) -- ( 92, 47) -- + ( 91, 47) .. controls ( 90, 46) and ( 88, 45) .. + ( 88, 45) .. controls ( 88, 45) and ( 88, 45) .. + ( 87, 45) .. controls ( 87, 45) and ( 87, 45) .. + ( 87, 45) .. controls ( 86, 46) and ( 86, 48) .. + ( 86, 49) -- ( 87, 50) -- + ( 86, 51) .. controls ( 85, 51) and ( 85, 52) .. + ( 85, 53) .. controls ( 85, 54) and ( 85, 57) .. + ( 85, 58) .. controls ( 85, 58) and ( 85, 58) .. + ( 82, 59) .. controls ( 79, 59) and ( 77, 59) .. + ( 77, 59) .. controls ( 77, 59) and ( 77, 59) .. + ( 78, 59) .. controls ( 80, 59) and ( 83, 59) .. + ( 85, 59) .. controls ( 85, 59) and ( 85, 59) .. + ( 85, 59) .. controls ( 86, 59) and ( 86, 59) .. + ( 86, 59) .. controls ( 86, 59) and ( 85, 59) .. + ( 84, 59) .. controls ( 82, 60) and ( 80, 60) .. + ( 79, 60) .. controls ( 78, 61) and ( 77, 61) .. + ( 77, 61) .. controls ( 77, 61) and ( 78, 61) .. + ( 79, 61) .. controls ( 81, 60) and ( 83, 60) .. + ( 85, 60) .. controls ( 86, 60) and ( 86, 60) .. + ( 86, 60) .. controls ( 86, 60) and ( 87, 61) .. + ( 88, 62) .. controls ( 89, 63) and ( 90, 63) .. + ( 92, 63) .. controls ( 92, 63) and ( 93, 64) .. + ( 93, 64) .. controls ( 93, 64) and ( 93, 64) .. + ( 93, 64) .. controls ( 92, 64) and ( 92, 65) .. + ( 92, 65) .. controls ( 92, 66) and ( 90, 66) .. + ( 89, 66) .. controls ( 88, 66) and ( 88, 66) .. + ( 87, 65) .. controls ( 87, 64) and ( 86, 63) .. + ( 86, 63) .. controls ( 85, 63) and ( 84, 63) .. + ( 84, 63) .. controls ( 84, 63) and ( 84, 63) .. + ( 84, 63) .. controls ( 85, 64) and ( 86, 65) .. + ( 86, 66) .. controls ( 87, 67) and ( 87, 68) .. + ( 88, 68) .. controls ( 89, 68) and ( 89, 68) .. + ( 90, 68) -- ( 92, 68) -- ( 92, 70) -- ( 92, 72) -- + ( 91, 72) .. controls ( 91, 72) and ( 91, 73) .. + ( 91, 73) .. controls ( 90, 73) and ( 90, 73) .. + ( 91, 73) .. controls ( 92, 73) and ( 92, 73) .. + ( 92, 73) .. controls ( 93, 73) and ( 93, 73) .. + ( 93, 70) .. controls ( 93, 67) and ( 93, 67) .. + ( 94, 66) -- ( 94, 66) -- + ( 94, 69) .. controls ( 94, 71) and ( 94, 73) .. + ( 94, 73) .. controls ( 94, 73) and ( 94, 73) .. + ( 93, 74) .. controls ( 93, 74) and ( 93, 74) .. + ( 93, 74) .. controls ( 93, 74) and ( 93, 74) .. + ( 94, 74) .. controls ( 94, 74) and ( 95, 74) .. + ( 96, 73) .. controls ( 96, 72) and ( 96, 71) .. + ( 96, 68) -- ( 96, 66) -- ( 96, 66) -- + ( 96, 69) .. controls ( 96, 72) and ( 96, 72) .. + ( 97, 73) .. controls ( 97, 74) and ( 99, 74) .. + ( 99, 74) .. controls ( 99, 74) and ( 99, 74) .. + ( 99, 73) .. controls ( 99, 73) and ( 98, 73) .. + ( 98, 72) .. controls ( 98, 72) and ( 98, 66) .. + ( 98, 66) .. controls ( 98, 66) and ( 99, 66) .. + ( 99, 66) .. controls ( 99, 67) and ( 99, 67) .. + ( 99, 69) .. controls ( 99, 71) and ( 99, 72) .. + ( 99, 72) .. controls ( 99, 73) and (100, 73) .. + (100, 73) .. controls (101, 73) and (101, 73) .. + (101, 73) .. controls (102, 73) and (102, 73) .. + (102, 73) .. controls (101, 72) and (101, 72) .. + (101, 69) .. controls (101, 66) and (101, 65) .. + (100, 65) .. controls (100, 64) and (100, 64) .. + (100, 64) -- ( 99, 64) -- + (100, 63) .. controls (101, 63) and (102, 63) .. + (103, 63) .. controls (104, 62) and (106, 61) .. + (106, 60) -- (106, 60) -- + (107, 60) .. controls (109, 60) and (113, 60) .. + (115, 61) .. controls (115, 61) and (115, 61) .. + (115, 61) .. controls (115, 60) and (111, 60) .. + (108, 59) .. controls (107, 59) and (107, 59) .. + (107, 59) .. controls (107, 59) and (107, 59) .. + (107, 59) -- (107, 59) -- + (108, 59) .. controls (110, 59) and (112, 59) .. + (114, 59) .. controls (115, 59) and (115, 59) .. + (115, 59) .. controls (115, 59) and (112, 59) .. + (109, 59) .. controls (108, 58) and (107, 58) .. + (107, 58) .. controls (107, 58) and (107, 58) .. + (107, 58) .. controls (107, 57) and (107, 56) .. + (107, 55) .. controls (107, 53) and (107, 53) .. + (107, 53) .. controls (107, 52) and (106, 51) .. + (106, 50) -- (105, 50) -- + (105, 48) .. controls (105, 47) and (105, 46) .. + (105, 46) -- (105, 45) -- + (104, 45) .. controls (104, 45) and (104, 45) .. + (103, 45) -- cycle; + \protect\end{scope} + \protect\end{tikzpicture}} + ~} +}{}\par + +\ifdefempty{\gitlabsocialsymbol} { + \renewcommand*{\gitlabsocialsymbol} { + \protect\raisebox{-0.12em}{ + \protect\begin{tikzpicture}[x=0.11em, y=0.11em, xscale=0.015, yscale=-0.015, inner sep=0pt, outer sep=0pt] + \protect\begin{scope}[shift={(507,387)}] + \protect\path[fill=color2,line width=0.057pt] + (105.2000,24.9000) .. controls (102.1000,16.0000) and (89.5000,16.0000) .. + (86.3000,24.9000) -- (29.8000,199.7000) -- (161.7000,199.7000) .. controls + (161.7000,199.7000) and (105.2000,24.9000) .. (105.2000,24.9000) -- cycle + (0.9000,287.7000) .. controls (-1.7000,295.7000) and (1.2000,304.6000) .. + (8.0000,309.7000) -- (255.9000,493.7000) -- (29.7000,199.7000) -- cycle + (161.7000,199.7000) -- (161.7000,199.7000) -- (256.0000,493.7000) -- (350.3000,199.7000) -- cycle + (511.1000,287.7000) -- (482.3000,199.7000) -- (256.0000,493.7000) -- + (503.9000,309.7000) .. controls (510.8000,304.6000) and (513.6000,295.7000) .. + (511.1000,287.7000) -- cycle(425.7000,24.9000) .. controls (422.6000,16.0000) + and (410.0000,16.0000) .. (406.8000,24.9000) -- (350.2000,199.7000) -- (482.2000,199.7000) -- cycle; + \protect\end{scope} + \protect\end{tikzpicture}} + ~} +}{}\par + +\ifdefempty{\skypesocialsymbol} { + \renewcommand*{\skypesocialsymbol} { + \protect\raisebox{-0.15em}{ + \protect\begin{tikzpicture}[y=0.08em, x=0.08em, xscale=0.020, yscale=-0.020, inner sep=0pt, outer sep=0pt] + \protect\begin{scope}[shift={(507,387)}] + \protect\path[fill=color2,even odd rule] + (487.6550,288.9690) .. controls (489.0610,278.5690) and (489.8700,267.9960) .. + (489.8700,257.2330) .. controls (489.8700,128.0770) and (384.5990,23.3610) .. + (254.7670,23.3610) .. controls (241.8630,23.3610) and (229.2120,24.4210) .. + (216.9010,26.4410) .. controls (194.8280,12.0570) and (168.5590,3.6740) .. + (140.2880,3.6740) .. controls (62.7660,3.6740) and (0.0000,66.4820) .. + (0.0000,143.9800) .. controls (0.0000,172.1780) and (8.2990,198.3740) .. + (22.5900,220.3690) .. controls (20.6650,232.3860) and (19.6810,244.6920) .. + (19.6810,257.2290) .. controls (19.6810,386.4050) and (124.8980,491.1100) .. + (254.7660,491.1100) .. controls (269.4230,491.1100) and (283.6930,489.6840) .. + (297.5620,487.1780) .. controls (319.1120,500.5470) and (344.4960,508.3260) .. + (371.7080,508.3260) .. controls (449.2100,508.3260) and (512.0010,445.5020) .. + (512.0010,368.0120) .. controls (511.9980,338.7190) and (503.0410,311.4840) .. + (487.6550,288.9690) -- cycle(276.7400,429.5960) .. controls (202.0340,433.4870) and (167.0750,416.9590) .. (135.0500,386.9050) .. controls (99.2850,353.3370) and (113.6520,315.0500) .. + (142.7900,313.1040) .. controls (171.9120,311.1590) and (189.3980,346.1160) .. + (204.9410,355.8400) .. controls (220.4650,365.5280) and (279.5340,387.6000) .. + (310.7350,351.9320) .. controls (344.7100,313.1040) and (288.1410,293.0120) .. + (246.6760,286.9300) .. controls (187.4730,278.1640) and (112.7260,246.1370) .. + (118.5410,183.0230) .. controls (124.3580,119.9490) and (172.1230,87.6090) .. + (222.3910,83.0470) .. controls (286.4680,77.2300) and (328.1820,92.7540) .. + (361.1760,120.9070) .. controls (399.3270,153.4360) and (378.6840,189.8010) .. + (354.3770,192.7270) .. controls (330.1660,195.6360) and (302.9730,139.2230) .. + (249.5860,138.3750) .. controls (194.5590,137.5110) and (157.3690,195.6360) .. + (225.3000,212.1590) .. controls (293.2660,228.6640) and (366.0500,235.4450) .. + (392.2610,297.5760) .. controls (418.4900,359.7130) and (351.5070,425.7010) .. + (276.7400,429.5960) -- cycle; + \protect\end{scope} + \protect\end{tikzpicture}} + ~} +}{}\par + +\ifdefempty{\googlescholarsocialsymbol} { + \renewcommand*{\googlescholarsocialsymbol} { + \protect\raisebox{-0.12em}{ + \protect\begin{tikzpicture}[y=2.0pt, x=2.0pt, yscale=-0.1, xscale=0.1, inner sep=0pt, outer sep=0pt] + \protect\begin{scope}[shift={(507,387)}] + \protect\path[fill=color2] (25.0000,2.0000) .. controls (12.3095,2.0000) and (2.0000,12.3095) + .. (2.0000,25.0000) .. controls (2.0000,37.6905) and (12.3095,48.0000) .. + (25.0000,48.0000) .. controls (37.6905,48.0000) and (48.0000,37.6905) .. + (48.0000,25.0000) .. controls (48.0000,12.3095) and (37.6905,2.0000) .. + (25.0000,2.0000) -- cycle(25.0000,4.0000) .. controls (36.6095,4.0000) and + (46.0000,13.3905) .. (46.0000,25.0000) .. controls (46.0000,36.6095) and + (36.6095,46.0000) .. (25.0000,46.0000) .. controls (13.3905,46.0000) and + (4.0000,36.6095) .. (4.0000,25.0000) .. controls (4.0000,13.3905) and + (13.3905,4.0000) .. (25.0000,4.0000) -- cycle(21.0000,11.0000) -- + (11.0000,20.0000) -- (17.7812,20.0000) .. controls (17.8012,22.8470) and + (19.9675,25.7305) .. (23.7695,25.7305) .. controls (24.1295,25.7305) and + (24.5297,25.6904) .. (24.9297,25.6504) .. controls (24.7497,26.1004) and + (24.5605,26.4701) .. (24.5605,27.0801) .. controls (24.5605,28.2301) and + (25.1404,28.9201) .. (25.6504,29.5801) .. controls (24.0204,29.6901) and + (20.9898,29.8795) .. (18.7598,31.2695) .. controls (16.6298,32.5595) and + (15.9805,34.4300) .. (15.9805,35.7500) .. controls (15.9805,38.4700) and + (18.5005,41.0000) .. (23.7305,41.0000) .. controls (29.9305,41.0000) and + (33.2207,37.5105) .. (33.2207,34.0605) .. controls (33.2207,31.5305) and + (31.7795,30.2799) .. (30.1895,28.9199) -- (28.9004,27.8906) .. controls + (28.5004,27.5706) and (27.9492,27.1203) .. (27.9492,26.3203) .. controls + (27.9492,25.5103) and (28.5007,24.9898) .. (28.9707,24.5098) .. controls + (30.4807,23.3098) and (32.0000,21.9602) .. (32.0000,19.2402) .. controls + (32.0000,18.1972) and (31.7562,17.3484) .. (31.4082,16.6504) -- + (35.0000,13.5703) -- (35.0000,17.2773) .. controls (34.4050,17.6233) and + (34.0000,18.2610) .. (34.0000,19.0000) -- (34.0000,25.0000) .. controls + (34.0000,26.1040) and (34.8960,27.0000) .. (36.0000,27.0000) .. controls + (37.1040,27.0000) and (38.0000,26.1040) .. (38.0000,25.0000) -- + (38.0000,19.0000) .. controls (38.0000,18.2620) and (37.5950,17.6243) .. + (37.0000,17.2773) -- (37.0000,12.0000) .. controls (37.0000,11.9570) and + (36.9806,11.9209) .. (36.9746,11.8789) -- (38.0000,11.0000) -- + (21.0000,11.0000) -- cycle(24.2695,14.2402) .. controls (27.2695,14.2402) and + (28.8203,18.3500) .. (28.8203,21.0000) .. controls (28.8203,21.6500) and + (28.7399,22.8199) .. (27.9199,23.6699) .. controls (27.3399,24.2599) and + (26.3709,24.6992) .. (25.4609,24.6992) .. controls (22.3709,24.6992) and + (20.9492,20.6202) .. (20.9492,18.1602) .. controls (20.9492,17.2102) and + (21.1400,16.2209) .. (21.7500,15.4609) .. controls (22.3300,14.7109) and + (23.3395,14.2402) .. (24.2695,14.2402) -- cycle(26.0391,30.6094) .. controls + (26.4091,30.6094) and (26.5909,30.6104) .. (26.8809,30.6504) .. controls + (29.6209,32.6304) and (30.8008,33.6202) .. (30.8008,35.4902) .. controls + (30.8008,37.7602) and (28.9700,39.4609) .. (25.5000,39.4609) .. controls + (21.6400,39.4609) and (19.1602,37.5905) .. (19.1602,34.9805) .. controls + (19.1602,32.3705) and (21.4598,31.4992) .. (22.2598,31.1992) .. controls + (23.7698,30.6792) and (25.7191,30.6094) .. (26.0391,30.6094) -- cycle; + \protect\end{scope} + \protect\end{tikzpicture}} +~} +}{}\par + +\ifdefempty{\matrixsocialsymbol} { + \renewcommand*{\matrixsocialsymbol} { + \protect\raisebox{-0.12em}{ + \protect\begin{tikzpicture}[y=1.8pt, x=1.8pt, yscale=-0.15, xscale=0.15, inner sep=0pt, outer sep=0pt] + \protect\begin{scope}[shift={(507,387)}] + \protect\path[fill=color2] + (0.9360,0.7320) .. controls (0.9360,10.9053) and (0.9360,21.0787) .. + (0.9360,31.2520) .. controls (1.6673,31.2520) and (2.3987,31.2520) .. + (3.1300,31.2520) .. controls (3.3452,32.0075) and (2.8778,32.0803) .. + (2.2413,31.9840) .. controls (1.5258,31.9840) and (0.8104,31.9840) .. + (0.0950,31.9840) .. controls (0.0950,21.3240) and (0.0950,10.6640) .. + (0.0950,0.0040) .. controls (1.1063,0.0040) and (2.1177,0.0040) .. + (3.1290,0.0040) .. controls (3.3442,0.7598) and (2.8768,0.8319) .. + (2.2403,0.7344) .. controls (1.8055,0.7336) and (1.3708,0.7328) .. + (0.9360,0.7320) -- cycle(9.3860,10.4070) .. controls (9.4181,10.9043) and + (9.3236,11.5281) .. (9.4300,11.9510) .. controls (10.7306,9.8293) and + (14.1727,9.3918) .. (15.8298,11.2910) .. controls (16.3916,12.8310) and + (17.3334,10.0899) .. (18.5637,10.2414) .. controls (20.4575,9.7636) and + (23.0149,10.3893) .. (23.6011,12.4937) .. controls (24.0197,14.2344) and + (23.7678,16.0478) .. (23.8370,17.8238) .. controls (23.8370,19.1536) and + (23.8370,20.4833) .. (23.8370,21.8130) .. controls (22.7947,21.8130) and + (21.7523,21.8130) .. (20.7100,21.8130) .. controls (20.6777,19.2218) and + (20.7833,16.6250) .. (20.6389,14.0382) .. controls (20.4668,12.0762) and + (17.2764,12.0985) .. (16.8890,13.9332) .. controls (16.5424,15.7480) and + (16.7622,17.6175) .. (16.7000,19.4583) .. controls (16.7000,20.2432) and + (16.7000,21.0281) .. (16.7000,21.8130) .. controls (15.6573,21.8130) and + (14.6147,21.8130) .. (13.5720,21.8130) .. controls (13.5377,19.1909) and + (13.6502,16.5608) .. (13.4952,13.9452) .. controls (13.2700,12.0546) and + (10.3372,12.2098) .. (9.8050,13.8370) .. controls (9.3690,15.2175) and + (9.6378,16.6981) .. (9.5630,18.1268) .. controls (9.5630,19.3556) and + (9.5630,20.5843) .. (9.5630,21.8130) .. controls (8.5200,21.8130) and + (7.4770,21.8130) .. (6.4340,21.8130) .. controls (6.4340,18.0097) and + (6.4340,14.2063) .. (6.4340,10.4030) .. controls (7.4180,10.4043) and + (8.4020,10.4057) .. (9.3860,10.4070) -- cycle(30.0980,31.2470) .. controls + (30.0980,21.0737) and (30.0980,10.9003) .. (30.0980,0.7270) .. controls + (29.3667,0.7270) and (28.6353,0.7270) .. (27.9040,0.7270) .. controls + (27.6888,-0.0285) and (28.1562,-0.1013) .. (28.7927,-0.0050) .. controls + (29.5082,-0.0050) and (30.2236,-0.0050) .. (30.9390,-0.0050) .. controls + (30.9390,10.6550) and (30.9390,21.3150) .. (30.9390,31.9750) .. controls + (29.9273,31.9750) and (28.9157,31.9750) .. (27.9040,31.9750) .. controls + (27.6888,31.2192) and (28.1562,31.1471) .. (28.7927,31.2446) .. controls + (29.2278,31.2454) and (29.6629,31.2462) .. (30.0980,31.2470) -- cycle; + \protect\end{scope} + \protect\end{tikzpicture}} + ~} +}{}\par + +\ifdefempty{\signalsocialsymbol} { + \renewcommand*{\signalsocialsymbol} { + \protect\raisebox{-0.12em}{ + \protect\begin{tikzpicture}[y=0.1pt, x=0.1pt, yscale=-0.13, xscale=0.13, inner sep=0pt, outer sep=0pt] + \protect\begin{scope}[shift={(507,387)}] + \protect\path[fill=color2] + (430.1000,180.9000) -- (437.8000,211.9000) .. controls (407.6000,219.3000) + and (378.7000,231.3000) .. (352.1000,247.3000) -- (335.7000,220.0000) .. + controls (365.0000,202.3000) and (396.9000,189.1000) .. (430.1000,180.9000) -- + cycle(593.9000,180.9000) -- (586.2000,211.9000) .. controls + (616.4000,219.3000) and (645.3000,231.3000) .. (671.9000,247.3000) -- + (688.4000,219.9000) .. controls (659.0000,202.3000) and (627.2000,189.1000) .. + (593.9000,180.9000) -- cycle(220.0000,335.7000) .. controls + (202.3000,365.0000) and (189.1000,396.9000) .. (180.9000,430.1000) -- + (211.9000,437.8000) .. controls (219.3000,407.6000) and (231.3000,378.7000) .. + (247.3000,352.1000) -- cycle(202.9000,512.0000) .. controls + (202.9000,496.5000) and (204.0000,481.0000) .. (206.4000,465.7000) -- + (174.8000,460.9000) .. controls (169.7000,494.8000) and (169.7000,529.2000) .. + (174.8000,563.1000) -- (206.4000,558.3000) .. controls (204.1000,543.0000) and + (202.9000,527.5000) .. (202.9000,512.0000) -- cycle(688.3000,804.0000) -- + (671.9000,776.6000) .. controls (645.3000,792.7000) and (616.5000,804.6000) .. + (586.3000,812.0000) -- (594.0000,843.0000) .. controls (627.2000,834.8000) and + (659.0000,821.7000) .. (688.3000,804.0000) -- cycle(821.1000,512.0000) .. + controls (821.1000,527.5000) and (820.0000,543.0000) .. (817.6000,558.3000) -- + (849.2000,563.1000) .. controls (854.3000,529.2000) and (854.3000,494.8000) .. + (849.2000,460.9000) -- (817.6000,465.7000) .. controls (819.9000,481.0000) and + (821.1000,496.5000) .. (821.1000,512.0000) -- cycle(843.1000,593.8000) -- + (812.1000,586.1000) .. controls (804.7000,616.3000) and (792.7000,645.2000) .. + (776.7000,671.8000) -- (804.1000,688.3000) .. controls (821.7000,659.0000) and + (834.9000,627.1000) .. (843.1000,593.8000) -- cycle(558.3000,817.6000) .. + controls (527.6000,822.2000) and (496.4000,822.2000) .. (465.7000,817.6000) -- + (460.9000,849.2000) .. controls (494.8000,854.3000) and (529.2000,854.3000) .. + (563.1000,849.2000) -- cycle(760.8000,695.3000) .. controls + (742.4000,720.3000) and (720.3000,742.3000) .. (695.3000,760.7000) -- + (714.3000,786.4000) .. controls (741.9000,766.1000) and (766.2000,741.9000) .. + (786.6000,714.4000) -- cycle(695.3000,263.2000) .. controls + (720.3000,281.6000) and (742.4000,303.7000) .. (760.8000,328.7000) -- + (786.5000,309.5000) .. controls (766.2000,282.0000) and (741.9000,257.7000) .. + (714.5000,237.5000) -- cycle(263.2000,328.7000) .. controls + (281.6000,303.7000) and (303.7000,281.6000) .. (328.7000,263.2000) -- + (309.5000,237.5000) .. controls (282.0000,257.8000) and (257.7000,282.1000) .. + (237.5000,309.5000) -- cycle(804.0000,335.7000) -- (776.6000,352.1000) .. + controls (792.7000,378.7000) and (804.6000,407.5000) .. (812.0000,437.7000) -- + (843.0000,430.0000) .. controls (834.9000,396.8000) and (821.7000,365.0000) .. + (804.0000,335.7000) -- cycle(465.7000,206.4000) .. controls + (496.4000,201.8000) and (527.6000,201.8000) .. (558.3000,206.4000) -- + (563.1000,174.8000) .. controls (529.2000,169.7000) and (494.8000,169.7000) .. + (460.9000,174.8000) -- cycle(279.6000,795.0000) -- (213.6000,810.4000) -- + (229.0000,744.4000) -- (197.9000,737.1000) -- (182.5000,803.1000) .. controls + (180.0000,813.9000) and (183.2000,825.2000) .. (191.0000,833.0000) .. controls + (198.8000,840.8000) and (210.1000,844.0000) .. (220.9000,841.5000) -- + (286.9000,826.4000) -- cycle(204.5000,708.5000) -- (235.6000,715.7000) -- + (246.3000,669.9000) .. controls (230.8000,643.8000) and (219.2000,615.5000) .. + (211.9000,586.0000) -- (180.9000,593.7000) .. controls (187.9000,622.0000) and + (198.4000,649.2000) .. (212.3000,674.7000) -- cycle(353.7000,777.8000) -- + (308.0000,788.5000) -- (315.2000,819.6000) -- (348.9000,811.8000) .. controls + (374.5000,825.7000) and (401.7000,836.3000) .. (430.0000,843.2000) -- + (437.7000,812.2000) .. controls (408.3000,804.9000) and (380.1000,793.2000) .. + (354.0000,777.6000) -- cycle(512.0000,234.9000) .. controls + (411.2000,235.0000) and (318.3000,289.8000) .. (269.6000,378.0000) .. controls + (220.9000,466.2000) and (223.9000,574.0000) .. (277.6000,659.4000) -- + (251.0000,773.1000) -- (364.7000,746.5000) .. controls (464.4000,809.3000) and + (592.9000,802.2000) .. (685.1000,728.8000) .. controls (777.3000,655.4000) and + (812.9000,531.7000) .. (774.0000,420.5000) .. controls (734.8000,309.2000) and + (629.8000,234.8000) .. (512.0000,234.9000) -- cycle; + \protect\end{scope} + \protect\end{tikzpicture}} + ~} +}{}\par + + +\endinput + +%% end of file `moderncviconstikz.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvskillmatrix.sty b/public/lib/templates/template7/inputs/moderncvskillmatrix.sty new file mode 100644 index 00000000..68b8db9a --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvskillmatrix.sty @@ -0,0 +1,1051 @@ +%% start of file `moderncvskillmatrix.sty'. +%% Copyright 2021 David Seus (cryptointerest@posteo.de). +% +% This package provides a skill matrix template for the moderncv package. +% Some recruiting firms require applicants to rate their skills, computer +% skills, management tools, or similar in a table involving a graphical +% illustration of their skill level. This package implements this idea +% and provides the following commands to use within the moderncv +% package: +% +% +% PUBLIC COMMANDS +% \cvskill{<1-5>} +% Illustrate skill level with little colored boxes. +% By default five skill levels are predefined. +% +% Input: +% input_1: integer between 0 and 5 +% +% Example usages: +% \cvskill{3} +% +% +% \cvskilllegend[*][<post_padding>][<first_level>][<second_level>][<third_level>][<fourth_level>][<fifth_level>]{<name>} +% Print legend table explaining the meaning of \cvskill{1}...\cvskill{5}. +% +% Input: +% asterix (optional): include vertical (dashed) lines. This behaviour depends on the body style. +% For the fancy style, the asterix has no meaning. +% input_1 (optional): padding length appended to the legend, default: <0.25em> +% input_2 (optional): string describing meaning of \cvskill{1}, default: <basic knowledge> +% input_3 (optional): string describing meaning of \cvskill{2}, default: <intermediate knowledge with some project experience> +% input_4 (optional): string describing meaning of \cvskill{3}, default: <extensive project experience> +% input_5 (optional): string describing meaning of \cvskill{4}, default: <deepened expert knowledge> +% input_6 (optional): string describing meaning of \cvskill{5}, default: <expert/guru> +% input_7: string giving a name to the legend, default: <> +% +% Example usages: +% \cvskilllegend{} print default legend +% \cvskilllegend[0.5em]{Legend} print default legend, but adjust post padding and display the word ``Legend''. +% \cvskilllegend*[0.2em][Grundkenntnisse][Grundkenntnisse und eigene Erfahrung in Projekten][Umfangreiche Erfahrung in Projekten][Vertiefte Expertenkenntnisse][Experte/Guru]{Legende} Fully adjust legend to German example and including dashed lines +% +% Note: +% -The width of the columns can be adjusted by the \setcvskilllegendcolumns, see \setcvskilllegendcolumns +% -The design of the table is such that the <second_level> entry stands in the first column but +% occupies rows two and three. This has been done to accomodate english and german defaults. +% An alternative is provided by \cvskillplainlegend +% +% +% \cvskillplainlegend[*][<post_padding>][<first_level>][<second_level>][<third_level>][<fourth_level>][<fifth_level>]{<name>} +% Print alternative legend table explaining the meaning of \cvskill{1}...\cvskill{5}. +% In this legend, the first three skill levels are in one column +% +% Input: +% asterix (optional): include vertical (dashed) lines. This behaviour depends on the body style. +% For the fancy style, the asterix has no meaning. +% input_1 (optional): padding length appended to the legend, default: <0.25em> +% input_2 (optional): string describing meaning of \cvskill{1}, default: <basic knowledge> +% input_3 (optional): string describing meaning of \cvskill{2}, default: <intermediate knowledge with some project experience> +% input_4 (optional): string describing meaning of \cvskill{3}, default: <extensive project experience> +% input_5 (optional): string describing meaning of \cvskill{4}, default: <deepened expert knowledge> +% input_6 (optional): string describing meaning of \cvskill{5}, default: <expert/guru> +% input_7: string giving a name to the legend, default: <> +% +% Example usages: +% \cvskillplainlegend{} print default legend +% \cvskillplainlegend[0.5em]{Legend} print default legend, but adjust post padding and display the word ``Legend''. +% \cvskillplainlegend*[0.2em][Grundkenntnisse][Grundkenntnisse und eigene Erfahrung in Projekten][Umfangreiche Erfahrung in Projekten][Vertiefte Expertenkenntnisse][Experte/Guru]{Legende} Fully adjust legend to German example and including dashed lines +% +% Note: +% -The width of the columns can be adjusted by the \setcvskilllegendcolumns, see \setcvskilllegendcolumns +% +% +% \cvskillhead[<post_padding>][<Level>][<Skill>][<Years>][<Comment>]% +% add skill matrix line acting as header explaining the meaning of columns. +% +% Input: +% input_1 (optional): padding length appended to the legend, default: <0.25em> +% input_2 (optional): string naming the level column (2nd column), default: <Level> +% input_3 (optional): string naming the skill column (3nd column), default: <Skill> +% input_4 (optional): string naming the experience-in-years column (4th column), default: <Years> +% input_5 (optional): string naming the comment column (5th column), default: <Comment> +% +% Example usages: +% \cvskillhead print default head. +% \cvskillhead[0.5em] print default head, but adjust post padding. +% \cvskillhead[0.25em][Level][F\"ahigkeit][Jahre][Bemerkung] Fully adjust head to German example +% +% Note: +% - The width of the columns can be adjusted by the \setcvskillcolumns command, see \setcvskillcolumns. +% +% +% \cvskillentry[*][<post_padding>]{<skill_cathegory>}{<0-5>}{<skill_name>}{<years_of_experience>}{<comment>}% +% add cvskill matrix row. +% +% Input: +% asterix (optional): include horizontal (dashed) line above the entered line. This behaviour depends on the body style. +% For the fancy style, the asterix has no meaning. +% input_1 (optional): padding length appended to the legend, default: <0.25em> +% input_2: string, naming skill cathegory, default: <> +% input_3: integer between 0 and 5, describing level of skill. \cvskill{input_2} is called internally, default: <> +% input_4: string, naming the skill, default: <> +% input_5: positive real number, stating the number of years of experience with this skill , default: <> +% input_6: string, explaining details w.r.t. that particual skill default: <> +% +% Example usages: +% \cvskillentry*{Language:}{3}{Python}{2}{I have done a million projects with Python} +% \cvskillentry{}{2}{Lilypond}{14}{So much sheet music! Man I'm the best!} +% \cvskillentry{}{3}{\LaTeX}{14}{Clearly I rock at \LaTeX} +% \cvskillentry*[1.5em]{OS:}{3}{Linux}{2}{I only use Archlinux} +% +% Note: +% - The width of the columns can be adjusted by the \setcvskillcolumns command, see \setcvskillcolumns. +% +% +% \setcvskillcolumns[<width>][<factor>][<exp_width>] +% adjust column width of skill table +% +% The \cvskillentry command comes with default FIXED width definitions of the kill matrix for the columns +% based on the author's own skill matrix. This is necessary to ensure that the entries are nicely aligned +% and actually yield a decent looking table. The defaults depend on the style used and are chosen reasonably. +% However, depending on the user input and the style that is used some of the columns might need adjustments. +% The \setcvskillcolumns command provides means to influence the width of the first, the third and the fourth +% skill matrix column. The second column containg the output of \cvskill remains fixed width. The last column, +% the comment column gets recalculated according to the setting of the other columns. +% +% Input +% Input_1 (optional): width smaller than \textwidth, default <\skillmatrix@hintscolumnwidth> +% Input_2 (optional): float between 0 and 1 adjusting how much percent of the table width without +% the first column is used columns two, three and four. Through this parameter +% the width of the 3rd column (skill name) can be adjusted, default <\skillmatrix@columnwidth> +% Input_3 (optional): width smaller than \textwidth, setting the width of the 4th column +% (Years of experience), default <\cvskill@experiencewidth> +% +% Example usage +% \setcvskillcolumns[5em][][]% adjust first column. Same as \setcvskillcolumns[5em] +% \setcvskillcolumns[][0.45][]% adjust third (skill) column. Same as \setcvskillcolumns[][0.45] +% \setcvskillcolumns[][][\widthof{``Year''}]% adjust fourth (years) column. +% \setcvskillcolumns[\widthof{``Language''}][0.48][]% adjust 1st and 3rd columns. Same as \setcvskillcolumns[\widthof{``Language''}][0.45] +% \setcvskillcolumns[\widthof{``Management Tools''}][0.6][3em]% ajust all at once. +% +% Note +% - For the styles 'classic' and 'casual' the first column is set to hintscolumnwidth such that +% it aligns with the rest of the entries. A readjustment of the first column should therefor +% be avoided. It is recomended to only use \setcvskillcolumns in the form of +% \setcvskillcolumns[][<factor>][<width>], thereby leaving the defaults in place for the first column. +% +% +% \setcvskilllegendcolumns[<width>][<factor>] +% adjust column width of legend +% +% The \cvskilllegend command comes with default FIXED width definitions for the columns of the legend matrix +% such that the default english and german examples look good. +% However, depending on the user input (translation) and the style that is used some adjustment might be needed. +% The \setcvskilllegendcolumns command provides means to influence all columns except the ones containing +% \cvskill commands. The second column containg the output of \cvskill remains fixed width. The last column, +% the comment column gets recalculated according to the setting of the other columns. +% +% Input +% Input_1 (optional): length smaller than \textwidth influencing the width of the first column +% where depending on the style the legend_string gets printed. In case the +% string is left empty adjusting this width allows moving the legend horizontally. +% Default <\skilllegend@hintscolumnwidth> +% Input_2 (optional): float between 0 and 1 influencing the width of the left legend descritor column, +% aka \cvskilllegend@leftdescriptorwidth. The desriptor column on the right, +% \cvskilllegend@rightdescriptorwidth is influenced by the factor 1-<factor>. +% Default <\skilllegend@leftdesriptorfactor> +% +% Example usage +% \setcvskilllegendcolumns[][0.45]%% adjust left desriptor column. +% \setcvskilllegendcolumns[\widthof{``Legend''}][0.45]% adjust both left descriptor column and string column +% +% Note +% - Due to implementation of \cvskilllegend for style 'fancy' (moderncvbodyv) +% the first optional variable has no effect in this case. +% - For the styles 'classic' and 'casual' the first column is set to hintscolumnwidth such that +% it aligns with the rest of the entries. A readjustment of the first column should therefor +% be avoided. It is recomended to only use \cvskilllegend in the form of +% \cvskilllegend[][<factor>], thereby leaving the defaults in place for the first column. +% - For style 'banking' the first column is set to align with the rest of the \cvskillentry entries +% Therefor adjusting the first column can be used to widen the table while moving it around. If no +% legend string is used, setting \cvskilllegend[0em] maximises the real enstate for the legend. +% +% +% PRIVATE COMMANDS +% +% \recompute@cvskillmatrix@lengths +% compute all lengths necessary for the skill matrix depending on +% the moderncv style (moderncvbody) +% +% Input: none +% +% Example usage (only internally in moderncvbody<i-v>.sty) +% \recompute@cvskillmatrix@lengths +% +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvskillmatrix}[2022-02-21 v2.3.1 modern curriculum vitae and letter skill matrix] + +% The definitions need to be adjusted depending on which moderncvbody<i-v>.sty style is usde. +% body type options: "moderncvbodyi" (default), "moderncvbodyii", "moderncvbodyiii", "moderncvbodyiv" or "moderncvbodyv" +\@initializeif{\if@moderncvbodyi}\@moderncvbodyifalse +\DeclareOption{moderncvbodyi}{\@moderncvbodyitrue\@moderncvbodyiifalse\@moderncvbodyiiifalse\@moderncvbodyivfalse\@moderncvbodyvfalse} +\@initializeif{\if@moderncvbodyii}\@moderncvbodyiifalse % this option is added in case moderncvbodyii gets implemented standalone +\DeclareOption{moderncvbodyii}{\@moderncvbodyifalse\@moderncvbodyiitrue\@moderncvbodyiiifalse\@moderncvbodyivfalse\@moderncvbodyvfalse} +\@initializeif{\if@moderncvbodyiii}\@moderncvbodyiiifalse +\DeclareOption{moderncvbodyiii}{\@moderncvbodyifalse\@moderncvbodyiifalse\@moderncvbodyiiitrue\@moderncvbodyivfalse\@moderncvbodyvfalse} +\@initializeif{\if@moderncvbodyiv}\@moderncvbodyivfalse +\DeclareOption{moderncvbodyiv}{\@moderncvbodyifalse\@moderncvbodyiifalse\@moderncvbodyiiifalse\@moderncvbodyivtrue\@moderncvbodyvfalse} +\@initializeif{\if@moderncvbodyv}\@moderncvbodyvfalse +\DeclareOption{moderncvbodyv}{\@moderncvbodyifalse\@moderncvbodyiifalse\@moderncvbodyiiifalse\@moderncvbodyivfalse\@moderncvbodyvtrue} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{moderncvbodyi} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- +\RequirePackage{tikz} +\RequirePackage{multirow} +% package arydshln is needed for the dashed lines but is incompatible with fancy style +\if@moderncvbodyv% +% \RequirePackage{arydshln} % incompatible with fancy style +\else% + \RequirePackage{arydshln} % incompatible with fancy style +\fi + +% %------------------------------------------------------------------------------- +% % \cvskill command +% %------------------------------------------------------------------------------- +% The code for the Skilllevel illustration with the little boxes. +% This is idea stolen from the limecv package, see https://github.com/opieters/limecv.git +\@initializelength{\cvSkill@RectangleSize} +\setlength{\cvSkill@RectangleSize}{1.2ex} +\newcount\my@repeat@count +\DeclareDocumentCommand{\cvskill}{m}{% +% Illustrate skill level with little colored boxes. +% By default five skill levels are predefined. +% +% Input: +% integer between 0 and 5 +% Example usage: +% \cvskill{3} + \begingroup + \my@repeat@count=\z@ + \@whilenum\my@repeat@count<#1\do{\tikz\filldraw[color1] (0, 0) rectangle (\cvSkill@RectangleSize, \cvSkill@RectangleSize);\advance% + \my@repeat@count\@ne\,}% + \my@repeat@count=\numexpr5-\z@\relax + \@whilenum\my@repeat@count>#1\do{\tikz\filldraw[color2!30] (0, 0) rectangle (\cvSkill@RectangleSize, \cvSkill@RectangleSize);\advance% + \my@repeat@count\m@ne\,}% + \endgroup +}% end \cvskill + +% %------------------------------------------------------------------------------- +% % \recompute@cvskillmatrix@lengths +% %------------------------------------------------------------------------------- + +% initialise lengths needed for the skillmatrix +\@initializelength{\cvskill@width} +\@initializelength{\cvskill@descriptorwidth} +\@initializelength{\cvskill@experiencewidth} +\@initializelength{\skillmatrix@columnwidth} +\@initializelength{\skillmatrix@commentwidth} +\@initializelength{\skillmatrix@padding} +\@initializelength{\skillmatrix@hintscolumnwidth} +\@initializelength{\skillmatrix@bodylength} +\@initializelength{\cvskilllegend@leftdescriptorwidth} +\@initializelength{\cvskilllegend@rightdescriptorwidth} +\@initializelength{\skilllegend@hintscolumnwidth} +\@initializelength{\skilllegend@padding} +\@initializelength{\skilllegend@bodylength} + +% \separatorrulewidth is defined in moderncvbodyv.sty and we need to +% define it to not throw an error in the other cases +\if@moderncvbodyv% +% +\else% + \@initializelength{\separatorrulewidth} + \setlength{\separatorrulewidth}{1ex} +\fi + +\DeclareDocumentCommand{\skilllegend@leftdesriptorfactor}{}{}% +%% DEFINITION \recompute@cvskillmatrix@lengths +% declare the command \recompute@cvskillmatrix@lengths empty +\DeclareDocumentCommand{\recompute@cvskillmatrix@lengths}{}{}% +% compute all lengths necessary for the skill matrix depending on +% the moderncv style (moderncvbody) +% +% Input: none +% +% Example usage (only internally in moderncvbody<i-v>.sty) +% \recompute@cvskillmatrix@lengths + +% Definition of \recompute@cvskillmatrix@lengths for moderncvbodyi +\if@moderncvbodyi% + \RenewDocumentCommand{\recompute@cvskillmatrix@lengths}{}{% + \setlength{\skillmatrix@padding}{1ex}% + \setlength{\skillmatrix@hintscolumnwidth}{\hintscolumnwidth}% + \setlength{\cvskill@width}{\widthof{\cvskill{5}}}% + \setlength{\cvskill@experiencewidth}{\widthof{``Year''}}% + \setlength{\skillmatrix@bodylength}{\maincolumnwidth}% + \setlength{\skillmatrix@columnwidth}{0.45\skillmatrix@bodylength}% + \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}% + \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}% + % lengths and definitions needed for the legends + % note that \skillmatrix@padding also affects the appearance of legends + \setlength{\skilllegend@padding}{0.25ex}% + \setlength{\skilllegend@hintscolumnwidth}{\hintscolumnwidth}% + \setlength{\skilllegend@bodylength}{\skillmatrix@bodylength}% + \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{0.5}% + } +\fi +% Definition of \recompute@cvskillmatrix@lengths for moderncvbodyiii +\if@moderncvbodyiii% + \RenewDocumentCommand{\recompute@cvskillmatrix@lengths}{}{% + \setlength{\skillmatrix@padding}{1ex}% + \setlength{\separatorcolumnwidth}{\skillmatrix@padding}% + \setlength{\skillmatrix@hintscolumnwidth}{\widthof{``Language''}}% + \setlength{\cvskill@width}{\widthof{\cvskill{5}}}% + \setlength{\cvskill@experiencewidth}{\widthof{``Year''}}% + \setlength{\skillmatrix@bodylength}{\maincolumnwidth-\skillmatrix@hintscolumnwidth-\separatorcolumnwidth}% + \setlength{\skillmatrix@columnwidth}{0.45\skillmatrix@bodylength}% + \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}% + \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}% + % lengths and definitions needed for the legends + % note that \skillmatrix@padding also affects the appearance of legends + \setlength{\skilllegend@padding}{0.25ex}% + \setlength{\skilllegend@hintscolumnwidth}{\skillmatrix@hintscolumnwidth}% + \setlength{\skilllegend@bodylength}{\skillmatrix@bodylength}% + \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{0.5}% + } +\fi +% Definition of \recompute@cvskillmatrix@lengths for moderncvbodyiv +\if@moderncvbodyiv% + \RenewDocumentCommand{\recompute@cvskillmatrix@lengths}{}{% + \setlength{\skillmatrix@padding}{1ex} + \setlength{\separatorcolumnwidth}{\skillmatrix@padding} + \setlength{\skillmatrix@hintscolumnwidth}{\widthof{``Languagi''}} + \setlength{\cvskill@width}{\widthof{\cvskill{5}}} + \setlength{\cvskill@experiencewidth}{\widthof{``Year''}} + \setlength{\skillmatrix@bodylength}{\maincolumnwidth-\skillmatrix@hintscolumnwidth-\separatorcolumnwidth} + \setlength{\skillmatrix@columnwidth}{0.45\skillmatrix@bodylength}% + \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth} + \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}% + % lengths and definitions needed for the legends + % note that \skillmatrix@padding also affects the appearance of legends + \setlength{\skilllegend@padding}{0.25ex} + \setlength{\skilllegend@hintscolumnwidth}{0ex}%\skillmatrix@hintscolumnwidth + \setlength{\skilllegend@bodylength}{\maincolumnwidth} + \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{0.45}% + } +\fi +% Definition of \recompute@cvskillmatrix@lengths for moderncvbodyv +\if@moderncvbodyv% + \RenewDocumentCommand{\recompute@cvskillmatrix@lengths}{}{% + \setlength{\skillmatrix@padding}{1ex}% + \setlength{\skillmatrix@hintscolumnwidth}{\widthof{``Languages''}}% + \setlength{\cvskill@width}{\widthof{\cvskill{5}}}% + \setlength{\cvskill@experiencewidth}{\widthof{``Year''}}% + \setlength{\skillmatrix@bodylength}{\maincolumnwidth-\skillmatrix@hintscolumnwidth-\skillmatrix@padding}%\skillmatrix@hintscolumnwidth + \setlength{\skillmatrix@columnwidth}{0.45\skillmatrix@bodylength}% + \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}% + \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}% + % lengths and definitions needed for the legends + % note that \skillmatrix@padding also affects the appearance of legends + \setlength{\skilllegend@padding}{0.25ex}% + \setlength{\skilllegend@hintscolumnwidth}{\skillmatrix@hintscolumnwidth}% + \setlength{\skilllegend@bodylength}{\maincolumnwidth}% + \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{0.48}% + }% +\fi + +% %------------------------------------------------------------------------------- +% % \setcvskillcolumns and \setcvskilllegendcolumns +% %------------------------------------------------------------------------------- +% \setcvskillcolumns[<width>][<factor>][<exp_width>] +\DeclareDocumentCommand{\setcvskillcolumns}{+O{\skillmatrix@hintscolumnwidth} +O{\skillmatrix@columnwidth} +O{\cvskill@experiencewidth}}{% +% adjust column width of skill table +% +% The \cvskillentry command comes with default FIXED width definitions of the kill matrix for the columns +% based on the author's own skill matrix. This is necessary to ensure that the entries are nicely aligned +% and actually yield a decent looking table. The defaults depend on the style used and are chosen reasonably. +% However, depending on the user input and the style that is used some of the columns might need adjustments. +% The \setcvskillcolumns command provides means to influence the width of the first, the third and the fourth +% skill matrix column. The second column containg the output of \cvskill remains fixed width. The last column, +% the comment column gets recalculated according to the setting of the other columns. +% +% Input +% Input_1 (optional): width smaller than \textwidth, default <\skillmatrix@hintscolumnwidth> +% Input_2 (optional): float between 0 and 1 adjusting how much percent of the table width without +% the first column is used columns two, three and four. Through this parameter +% the width of the 3rd column (skill name) can be adjusted, default <\skillmatrix@columnwidth> +% Input_3 (optional): width smaller than \textwidth, setting the width of the 4th column +% (Years of experience), default <\cvskill@experiencewidth> +% +% Example usage +% \setcvskillcolumns[5em][][]% adjust first column. Same as \setcvskillcolumns[5em] +% \setcvskillcolumns[][0.45][]% adjust third (skill) column. Same as \setcvskillcolumns[][0.45] +% \setcvskillcolumns[][][\widthof{``Year''}]% adjust fourth (years) column. +% \setcvskillcolumns[\widthof{``Language''}][0.48][]% adjust 1st and 3rd columns. Same as \setcvskillcolumns[\widthof{``Language''}][0.45] +% \setcvskillcolumns[\widthof{``Management Tools''}][0.6][3em]% ajust all at once. +% +% Note +% - For the styles 'classic' and 'casual' the first column is set to hintscolumnwidth such that +% it aligns with the rest of the entries. A readjustment of the first column should therefor +% be avoided. It is recomended to only use \setcvskillcolumns in the form of +% \setcvskillcolumns[][<factor>][<width>], thereby leaving the defaults in place for the first column. +% + \def\arg@new@hintscolumnwidth{#1}% <-- all these terminal % signs are necessary for the fancy style to not show weird spaces!!! + \def\arg@new@bodyLengthFactor{#2}% + \def\arg@new@experienceWidth{#3}% + % Check for empty arguments. Defaults are given. Thus a call of \setcvskillcolumns + % without any arguments leads to nonempty arguments \arg@new@hintscolumnwidth and + % \def\arg@new@bodyLengthFactor{#2}. However, we need to take care of calls like + % \setcvskillcolumns[], \setcvskillcolumns[][], \setcvskillcolumns[][][] or even + % \setcvskillcolumns[<somelength>][], \setcvskillcolumns[][<somefactor>] \setcvskillcolumns[][][<length>] + \ifdefempty{\arg@new@hintscolumnwidth}{% + % Case \setcvskillcolumns[], \setcvskillcolumns[][] or \setcvskillcolumns[][<somefactor>] + \ifdefempty{\arg@new@bodyLengthFactor}{% + % Case \setcvskillcolumns[][] do nothing here and check if third argument is empty + \ifdefempty{\arg@new@experienceWidth}{% + % Case \setcvskillcolumns[][][] do nothing here + }{% + % Case \setcvskillcolumns[][][<length>]. reset \cvskill@experiencewidth and + % \cvskill@descriptorwidth accordingly + \setlength{\cvskill@experiencewidth}{\arg@new@experienceWidth}% + \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}% + }% + }{% + % Case \setcvskillcolumns[][<somefactor>], \setcvskillcolumns[][<somefactor>][<possilly length>] + \setlength{\skillmatrix@columnwidth}{\arg@new@bodyLengthFactor\skillmatrix@bodylength}% + \ifdefempty{\arg@new@experienceWidth}{% + % Case \setcvskillcolumns[][<somefactor>][] do nothing here + }{% + % Case \setcvskillcolumns[][<somefactor>][<length>]. reset \cvskill@experiencewidth and + % \cvskill@descriptorwidth accordingly + \setlength{\cvskill@experiencewidth}{\arg@new@experienceWidth}% + \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}% + }% + \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}% + \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}% + }% + % Case \setcvskillcolumns[] nothing needs to be done here recalculate lengths affected by the change + }{% + % Case \setcvskillcolumns, \setcvskillcolumns[<width>], \setcvskillcolumns[<width>][] + % or \setcvskillcolumns[<width>][<somefactor>] + \setlength{\skillmatrix@hintscolumnwidth}{\arg@new@hintscolumnwidth}% + \setlength{\skillmatrix@bodylength}{\maincolumnwidth-\skillmatrix@hintscolumnwidth-\separatorcolumnwidth}% + % in case second argument is given but left empty use default + \ifdefempty{\arg@new@bodyLengthFactor}{% + % Case \setcvskillcolumns[<width>][] do nothing here and use default + % \skillmatrix@columnwidth and check third argument + \ifdefempty{\arg@new@experienceWidth}{% + % Case \setcvskillcolumns[<width>][][] do nothing here + }{% + % Case \setcvskillcolumns[<width>][][<length>]. reset \cvskill@experiencewidth and + % \cvskill@descriptorwidth accordingly + \setlength{\cvskill@experiencewidth}{\arg@new@experienceWidth}% +% \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}% + }% + }{% + % Case \setcvskillcolumns, \setcvskillcolumns[<width>], \setcvskillcolumns[<width>][<somefactor>] + \setlength{\skillmatrix@columnwidth}{\arg@new@bodyLengthFactor\skillmatrix@bodylength}% + \ifdefempty{\arg@new@experienceWidth}{% + % Case \setcvskillcolumns[<width>][<somefactor>][] do nothing here + }{% + % Case \setcvskillcolumns[<width>][<somefactor>][<length>]. reset \cvskill@experiencewidth and + % \cvskill@descriptorwidth accordingly + \setlength{\cvskill@experiencewidth}{\arg@new@experienceWidth}% +% \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}% + }% + }% + \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}% + \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}% + }% +}% +% +% \setcvskilllegendcolumns[<width>][<factor>] +\DeclareDocumentCommand{\setcvskilllegendcolumns}{+O{\skilllegend@hintscolumnwidth} +O{\skilllegend@leftdesriptorfactor}}{% +% adjust column width of legend +% +% The \cvskilllegend command comes with default FIXED width definitions for the columns of the legend matrix +% such that the default english and german examples look good. +% However, depending on the user input (translation) and the style that is used some adjustment might be needed. +% The \setcvskilllegendcolumns command provides means to influence all columns except the ones containing +% \cvskill commands. The second column containg the output of \cvskill remains fixed width. The last column, +% the comment column gets recalculated according to the setting of the other columns. +% +% Input +% Input_1 (optional): length smaller than \textwidth influencing the width of the first column +% where depending on the style the legend_string gets printed. In case the +% string is left empty adjusting this width allows moving the legend horizontally. +% Default <\skilllegend@hintscolumnwidth> +% Input_2 (optional): float between 0 and 1 influencing the width of the left legend descritor column, +% aka \cvskilllegend@leftdescriptorwidth. The desriptor column on the right, +% \cvskilllegend@rightdescriptorwidth is influenced by the factor 1-<factor>. +% Default <\skilllegend@leftdesriptorfactor> +% +% Example usage +% \setcvskilllegendcolumns[][0.45]%% adjust left desriptor column. +% \setcvskilllegendcolumns[\widthof{``Legend''}][0.45]% adjust both left descriptor column and string column +% +% Note +% - Due to implementation of \cvskilllegend for style 'fancy' (moderncvbodyv) +% the first optional variable has no effect in this case. +% - For the styles 'classic' and 'casual' the first column is set to hintscolumnwidth such that +% it aligns with the rest of the entries. A readjustment of the first column should therefor +% be avoided. It is recomended to only use \cvskilllegend in the form of +% \cvskilllegend[][<factor>], thereby leaving the defaults in place for the first column. +% - For style 'banking' the first column is set to align with the rest of the \cvskillentry entries +% Therefor adjusting the first column can be used to widen the table while moving it around. If no +% legend string is used, setting \cvskilllegend[0em] maximises the real enstate for the legend. +% + \def\arg@new@legend@hintscolumnwidth{#1}% + \def\arg@new@legend@leftDescriptorFactor{#2}% + % Check for empty arguments. See explanation above + \ifdefempty{\arg@new@legend@hintscolumnwidth}{% + % Case \setcvskilllegendcolumns[], \setcvskilllegendcolumns[][] or \setcvskilllegendcolumns[][<somefactor>] + \ifdefempty{\arg@new@legend@leftDescriptorFactor}{% +% % Case \setcvskilllegendcolumns[][] do nothing here, i.e. leave default values unaltered + }{% + % Case \setcvskilllegendcolumns[][<somefactor>], \setcvskilllegendcolumns[][<somefactor>] + \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{\arg@new@legend@leftDescriptorFactor}% + }% +% % Case \setcvskilllegendcolumns[] nothing needs to be done here i.e. leave default values unaltered + }{% + % Case \setcvskilllegendcolumns, \setcvskilllegendcolumns[<width>], \setcvskilllegendcolumns[<width>][] + % or \setcvskilllegendcolumns[<width>][<somefactor>] + \setlength{\skilllegend@hintscolumnwidth}{\arg@new@legend@hintscolumnwidth}% + \if@moderncvbodyi% + \setlength{\skilllegend@bodylength}{\textwidth-\skilllegend@hintscolumnwidth-\separatorcolumnwidth}% + \fi% + \if@moderncvbodyiii% + \setlength{\skilllegend@bodylength}{\textwidth-\skilllegend@hintscolumnwidth-\separatorcolumnwidth}% + \fi% + \if@moderncvbodyiv% + \setlength{\skilllegend@bodylength}{\maincolumnwidth-\skilllegend@hintscolumnwidth-\separatorcolumnwidth}% + \fi% + % in case second argument is given but left empty use default + \ifdefempty{\arg@new@legend@leftDescriptorFactor}{% + % Case \setcvskilllegendcolumns[<width>][] do nothing here and leave default values unaltered + }{% + % Case \setcvskilllegendcolumns, \setcvskilllegendcolumns[<width>], \setcvskilllegendcolumns[<width>][<somefactor>] + \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{\arg@new@legend@leftDescriptorFactor}% + }% + }% +}% +% +% %------------------------------------------------------------------------------- +% % \cvskilllegend +% %------------------------------------------------------------------------------- +% default legend style +% \cvskilllegend[*][<post_padding>][<first_level>][<second_level>][<third_level>][<fourth_level>][<fifth_level>]{<name>} +\NewDocumentCommand\skillLegend@FontSize{}{\scriptsize} +\DeclareDocumentCommand\cvskilllegend{s +O{} +O{} +O{} +O{} +O{} +O{} +m}{}% +% Print legend table explaining the meaning of \cvskill{1}...\cvskill{5}. +% +% Input: +% asterix (optional): include vertical (dashed) lines. This behaviour depends on the body style. +% For the fancy style, the asterix has no meaning. +% input_1 (optional): padding length appended to the legend, default: <0.25em> +% input_2 (optional): string describing meaning of \cvskill{1}, default: <basic knowledge> +% input_3 (optional): string describing meaning of \cvskill{2}, default: <intermediate knowledge with some project experience> +% input_4 (optional): string describing meaning of \cvskill{3}, default: <extensive project experience> +% input_5 (optional): string describing meaning of \cvskill{4}, default: <deepened expert knowledge> +% input_6 (optional): string describing meaning of \cvskill{5}, default: <expert/guru> +% input_7: string giving a name to the legend, default: <> +% +% Example usages: +% \cvskilllegend{} print default legend +% \cvskilllegend[0.5em]{Legend} print default legend, but adjust post padding and display the word ``Legend''. +% \cvskilllegend*[0.2em][Grundkenntnisse][Grundkenntnisse und eigene Erfahrung in Projekten][Umfangreiche Erfahrung in Projekten][Vertiefte Expertenkenntnisse][Experte/Guru]{Legende} Fully adjust legend to German example and including dashed lines +% +% Note: +% -The width of the columns can be adjusted by the \setcvskilllegendcolumns, see \setcvskilllegendcolumns +% -The design of the table is such that the <second_level> entry stands in the first column but +% occupies rows two and three. This has been done to accomodate english and german defaults. +% An alternative is provided by \cvskillplainlegend + +% declare default legend entries +\NewDocumentCommand\skillLegend@defaultLevelOne{}{basic knowledge} +\NewDocumentCommand\skillLegend@defaultLevelTwo{}{intermediate knowledge with some project experience} +\NewDocumentCommand\skillLegend@defaultLevelThree{}{extensive project experience} +\NewDocumentCommand\skillLegend@defaultLevelFour{}{deepened expert knowledge} +\NewDocumentCommand\skillLegend@defaultLevelFive{}{expert\,/\,specialist} +% Redefinition of \cvskilllegend valid for moderncvbodyi, moderncvbodyii, moderncvbodyiii +\RenewDocumentCommand\cvskilllegend{s +O{.25em} +O{\skillLegend@defaultLevelOne} +O{\skillLegend@defaultLevelTwo} +O{\skillLegend@defaultLevelThree} +O{\skillLegend@defaultLevelFour} +O{\skillLegend@defaultLevelFive} +m}{% + \IfBooleanTF#1{% if a star is given, add dashed line + \begingroup% + \arrayrulecolor{color1}% + % calculate descriptor widths + \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}% + \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}% + \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}% + @{\hspace{\separatorcolumnwidth}}% + p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}%% + p{2\skilllegend@padding}p{\cvskilllegend@leftdescriptorwidth}@{}@{\hspace{2\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}% + p{2\skilllegend@padding}% + p{\cvskilllegend@rightdescriptorwidth}@{}}% + \raggedleft\hintstyle{#8} & \cvskill{1}& & {\skillLegend@FontSize #3} & \cvskill{3}& &{\skillLegend@FontSize #5 } \\% + % + & \cvskill{2} & & \multirow{2}{\cvskilllegend@leftdescriptorwidth}{{\skillLegend@FontSize #4}} & \cvskill{4}& & {\skillLegend@FontSize #6 } \\% + % + & & & & \cvskill{5}& & {\skillLegend@FontSize #7 }% + \end{tabular}% + \endgroup + \par\addvspace{#2}}{% + % if no star is given, do not add dashed line. We need less padding in this case + \begingroup% + % calculate descriptor columns width. note the adjusted padding + \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-1\skilllegend@padding}% + \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-1\skilllegend@padding}% + \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}% + @{\hspace{\separatorcolumnwidth}}% + p{\cvskill@width}@{\hspace{\skilllegend@padding}}% + p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{\skilllegend@padding}}% + p{\cvskilllegend@rightdescriptorwidth}@{}}% + \raggedleft\hintstyle{#8} & \cvskill{1}\, & \,{\skillLegend@FontSize #3} & \cvskill{3}\, &\,{\skillLegend@FontSize #5 } \\% + % + & \cvskill{2}\, & \,\multirow{2}{\cvskilllegend@leftdescriptorwidth}{{\skillLegend@FontSize #4}} & \cvskill{4}\, &\,{\skillLegend@FontSize #6 } \\% + % + & & & \cvskill{5}\, &\,{\skillLegend@FontSize #7 }% + \end{tabular}% + \endgroup% + \par\addvspace{#2}% + }% +}% +% Redefinition of \cvskilllegend valid for moderncvbodyiv +\if@moderncvbodyiv% + \RenewDocumentCommand\cvskilllegend{s +O{.25em} +O{\skillLegend@defaultLevelOne} +O{\skillLegend@defaultLevelTwo} +O{\skillLegend@defaultLevelThree} +O{\skillLegend@defaultLevelFour} +O{\skillLegend@defaultLevelFive} +m}{% + \def\arg@legendString{#8}% + \ifdefempty{\arg@legendString}{% + }{% + \cvitem[0.25em]{\hintstyle{#8}}{}% + }% + \IfBooleanTF#1{% if a star is given, add dashed line + \begingroup% + % recalculate desrciptor widths on the fly. Allows for different padding + % in the stared and nonstared case + \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-4\skilllegend@padding}% + \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-4\skilllegend@padding}% + \arrayrulecolor{color1} + \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth} + @{\hspace{\separatorcolumnwidth}}p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}% + p{2\skilllegend@padding}% + p{\cvskilllegend@leftdescriptorwidth}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}% + p{2\skilllegend@padding}p{\cvskilllegend@rightdescriptorwidth}@{}}% + \raggedleft\hintstyle{} & \cvskill{1} & & {\skillLegend@FontSize #3} & \cvskill{3} & & {\skillLegend@FontSize #5 } \\ + % + & \cvskill{2} & & \multirow{2}{\cvskilllegend@leftdescriptorwidth}{{\skillLegend@FontSize #4}} & \cvskill{4} & &{\skillLegend@FontSize #6 } \\ + % + & & & & \cvskill{5}& & {\skillLegend@FontSize #7 } + \end{tabular}% + \endgroup% + \par\addvspace{#2}}{ + \begingroup% + % oddly enough, we should only need to subtract 2 paddings in the descritorwidths. + % but while testing I got overflow of text into the margin + \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-4\skilllegend@padding}% + \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-5\skilllegend@padding}% + \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth} + @{\hspace{\separatorcolumnwidth}}p{\cvskill@width}@{\hspace{2\skilllegend@padding}}% + p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{2\skilllegend@padding}}% + p{\cvskilllegend@rightdescriptorwidth}@{}}% + \raggedleft\hintstyle{} & \cvskill{1} & {\skillLegend@FontSize #3} & \cvskill{3} & {\skillLegend@FontSize #5 } \\ + % + & \cvskill{2} & \multirow{2}{\cvskilllegend@leftdescriptorwidth}{{\skillLegend@FontSize #4}} & \cvskill{4} &{\skillLegend@FontSize #6 } \\ + % + & & & \cvskill{5} & {\skillLegend@FontSize #7 } + \end{tabular}% + \endgroup% + \par\addvspace{#2} + } + } +\fi +% Redefinition of \cvskilllegend valid for moderncvbodyv +\if@moderncvbodyv% + \DeclareDocumentCommand\@starIndependentTabular{}{}% + \RenewDocumentCommand\cvskilllegend{s +O{.25em} +O{\skillLegend@defaultLevelOne} +O{\skillLegend@defaultLevelTwo} +O{\skillLegend@defaultLevelThree} +O{\skillLegend@defaultLevelFour} +O{\skillLegend@defaultLevelFive} +m}{% + % check whether Argument #8 is given and if so provide it as cvitem + \def\arg@legendString{#8}% + \ifdefempty{\arg@legendString}{% + \vspace*{-\separatorrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :( + }{% + \cvitem[-0.5em]{#8}{}% + }% + \arrayrulecolor{color1}% + \setlength\arrayrulewidth{\separatorrulewidth}% + \RenewDocumentCommand{\@starIndependentTabular}{}{% + \begingroup% + \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}% + \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}% +% \renewcommand{\arraystretch}{1.0}% + \begin{tabular}[t]{@{}p{\hintscolumnwidth}%\skilllegend@hintscolumnwidth + @{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}% + p{\cvskill@width}@{\hspace{3\skilllegend@padding}}% + p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{3\skilllegend@padding}}% + p{\cvskilllegend@rightdescriptorwidth}@{}}% + \@moderncvstrut{4pt}{16pt} & \cvskill{1}& {\skillLegend@FontSize #3} & \cvskill{3}& {\skillLegend@FontSize #5 }\\% + % + & \cvskill{2}& \multirow{2}{\cvskilllegend@leftdescriptorwidth}{{\skillLegend@FontSize #4}} & \cvskill{4}& {\skillLegend@FontSize #6 }\\% + % + & & & \cvskill{5} & {\skillLegend@FontSize #7 }\\[#2]% the spacing needs to be inside the cell for the vertical rule to extend correctly + \end{tabular}% + \endgroup% + \par\@aftersectionfalse\ignorespaces% + }% + % because of this weird style and the position of the parameter [#2], the dashed lines of the other version look bad. So no lines. + \IfBooleanTF#1{% + \@starIndependentTabular% + }{% + \@starIndependentTabular% + }% + }% +\fi + +% %------------------------------------------------------------------------------- +% % \cvskillplainlegend +% %------------------------------------------------------------------------------- +% alternative legend style +% \cvskillplainlegend[*][<post_padding>][<first_level>][<second_level>][<third_level>][<fourth_level>][<fifth_level>]{<name>} +\DeclareDocumentCommand\cvskillplainlegend{s +O{} +O{} +O{} +O{} +O{} +O{} +m}{}% +% Print alternative legend table explaining the meaning of \cvskill{1}...\cvskill{5}. +% In this legend, the first three skill levels are in one column +% +% Input: +% asterix (optional): include vertical (dashed) lines. This behaviour depends on the body style. +% For the fancy style, the asterix has no meaning. +% input_1 (optional): padding length appended to the legend, default: <0.25em> +% input_2 (optional): string describing meaning of \cvskill{1}, default: <basic knowledge> +% input_3 (optional): string describing meaning of \cvskill{2}, default: <intermediate knowledge with some project experience> +% input_4 (optional): string describing meaning of \cvskill{3}, default: <extensive project experience> +% input_5 (optional): string describing meaning of \cvskill{4}, default: <deepened expert knowledge> +% input_6 (optional): string describing meaning of \cvskill{5}, default: <expert/guru> +% input_7: string giving a name to the legend, default: <> +% +% Example usages: +% \cvskillplainlegend{} print default legend +% \cvskillplainlegend[0.5em]{Legend} print default legend, but adjust post padding and display the word ``Legend''. +% \cvskillplainlegend*[0.2em][Grundkenntnisse][Grundkenntnisse und eigene Erfahrung in Projekten][Umfangreiche Erfahrung in Projekten][Vertiefte Expertenkenntnisse][Experte/Guru]{Legende} Fully adjust legend to German example and including dashed lines +% +% Note: +% -The width of the columns can be adjusted by the \setcvskilllegendcolumns, see \setcvskilllegendcolumns + +% declare default legend entries +\NewDocumentCommand\skillPlainLegend@defaultLevelOne{}{basic knowlegde} +\NewDocumentCommand\skillPlainLegend@defaultLevelTwo{}{intermediate knowledge, some project experience} +\NewDocumentCommand\skillPlainLegend@defaultLevelThree{}{extensive project experience} +\NewDocumentCommand\skillPlainLegend@defaultLevelFour{}{deepened expert knowledge} +\NewDocumentCommand\skillPlainLegend@defaultLevelFive{}{expert/guru} +% Redefinition of \cvskillplainlegend valid for moderncvbodyi, moderncvbodyii, moderncvbodyiii +\RenewDocumentCommand\cvskillplainlegend{s +O{.25em} +O{\skillPlainLegend@defaultLevelOne} +O{\skillPlainLegend@defaultLevelTwo} +O{\skillPlainLegend@defaultLevelThree} +O{\skillPlainLegend@defaultLevelFour} +O{\skillPlainLegend@defaultLevelFive} +m}{% + \IfBooleanTF#1{% if a star is given, add dashed line + \begingroup% + \arrayrulecolor{color1}% + % calculate descriptor widths + \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}% + \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}% + \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}% + @{\hspace{\separatorcolumnwidth}}% + p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}%% + p{2\skilllegend@padding}p{\cvskilllegend@leftdescriptorwidth}@{}@{\hspace{2\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}% + p{2\skilllegend@padding}% + p{\cvskilllegend@rightdescriptorwidth}@{}}% + \raggedleft\hintstyle{#8} & \cvskill{1}& & {\skillLegend@FontSize #3} & \cvskill{4}& &{\skillLegend@FontSize #6} \\% + % + & \cvskill{2} & & {\skillLegend@FontSize #4} & \cvskill{5}& & {\skillLegend@FontSize #7} \\% + % + & \cvskill{3} & & {\skillLegend@FontSize #5} & & & % + \end{tabular}% + \endgroup% + \par\addvspace{#2}}{% + % if no star is given, do not add dashed line + \begingroup% + % calculate descriptor widths, note that we use less padding + \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-2\skilllegend@padding}% + \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-2\skilllegend@padding}% + \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}% + @{\hspace{\separatorcolumnwidth}}% + p{\cvskill@width}@{\hspace{2\skilllegend@padding}}% + p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{2\skilllegend@padding}}% + p{\cvskilllegend@rightdescriptorwidth}@{}}% + \raggedleft\hintstyle{#8} & \cvskill{1} & {\skillLegend@FontSize #3} & \cvskill{4} &{\skillLegend@FontSize #6} \\% + % + & \cvskill{2} & {\skillLegend@FontSize #4} & \cvskill{5} &{\skillLegend@FontSize #7} \\% + % + & \cvskill{3} & {\skillLegend@FontSize #5 } & & % + \end{tabular}% + \endgroup% + \par\addvspace{#2}% + }% +}% +% Redefinition of \cvskillplainlegend valid for moderncvbodyiv +\if@moderncvbodyiv% + \RenewDocumentCommand\cvskillplainlegend{s +O{.25em} +O{\skillPlainLegend@defaultLevelOne} +O{\skillPlainLegend@defaultLevelTwo} +O{\skillPlainLegend@defaultLevelThree} +O{\skillPlainLegend@defaultLevelFour} +O{\skillPlainLegend@defaultLevelFive} +m}{% + \def\arg@legendString{#8}% + \ifdefempty{\arg@legendString}{% + }{% + \cvitem[0.25em]{\hintstyle{#8}}{}% + }% + \IfBooleanTF#1{% if a star is given, add dashed line + \begingroup% + \arrayrulecolor{color1} + \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-6\skilllegend@padding}% + \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-6\skilllegend@padding}% + \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth} + @{\hspace{\separatorcolumnwidth}}p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}% + p{2\skilllegend@padding}% + p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}% + p{2\skilllegend@padding}p{\cvskilllegend@rightdescriptorwidth}@{}}% + \raggedleft\hintstyle{} & \cvskill{1} & & {\skillLegend@FontSize#3} & \cvskill{4} & & {\skillLegend@FontSize#6}\\% + % + & \cvskill{2} & &{\skillLegend@FontSize#4} & \cvskill{5} & &{\skillLegend@FontSize#7}\\% + % + & \cvskill{3} & &{\skillLegend@FontSize#5} & & &% + \end{tabular}% + \endgroup% + \par\addvspace{#2}}{ + % if no star is given, do not add dashed line + \begingroup + \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}% + \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-4\skilllegend@padding}% + \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth} + @{\hspace{\separatorcolumnwidth}}p{\cvskill@width}@{\hspace{\skilllegend@padding}}% + p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{\skilllegend@padding}}% + p{\cvskilllegend@rightdescriptorwidth}@{}}% + \raggedleft\hintstyle{} & \cvskill{1} & {\skillLegend@FontSize #3} & \cvskill{4} & {\skillLegend@FontSize #6} \\ + % + & \cvskill{2} & {\skillLegend@FontSize #4} & \cvskill{5} & {\skillLegend@FontSize #7} \\ + % + & \cvskill{3} & {\skillLegend@FontSize #5} & & % + \end{tabular}% + \endgroup + \par\addvspace{#2} + } + } +\fi +% Redefinition of \cvskillplainlegend valid for moderncvbodyv +\if@moderncvbodyv% + \RenewDocumentCommand\cvskillplainlegend{s +O{.25em} +O{\skillPlainLegend@defaultLevelOne} +O{\skillPlainLegend@defaultLevelTwo} +O{\skillPlainLegend@defaultLevelThree} +O{\skillPlainLegend@defaultLevelFour} +O{\skillPlainLegend@defaultLevelFive} +m}{% + % check whether Argument #8 is given and if so provide it as cvitem + \def\arg@legendString{#8}% + \ifdefempty{\arg@legendString}{% + \vspace*{-\separatorrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :( + }{% + \cvitem[-0.5em]{#8}{}% + }% + \arrayrulecolor{color1}% + \setlength\arrayrulewidth{\separatorrulewidth}% + \RenewDocumentCommand{\@starIndependentTabular}{}{% + \begingroup% +% \renewcommand{\arraystretch}{1.0}% + \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-2\skilllegend@padding}% + \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-2\skilllegend@padding}% + \begin{tabular}[t]{@{}p{\hintscolumnwidth}%\skilllegend@hintscolumnwidth + @{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}% + p{\cvskill@width}@{\hspace{2\skilllegend@padding}}% + p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{2\skilllegend@padding}}% + p{\cvskilllegend@rightdescriptorwidth}@{}}% + \@moderncvstrut{4pt}{16pt} & \cvskill{1} & {\skillLegend@FontSize #3} & \cvskill{4} & {\skillLegend@FontSize #6}\\% + % + & \cvskill{2} & {\skillLegend@FontSize #4} & \cvskill{5} & {\skillLegend@FontSize #7}\\% + % + & \cvskill{3} & {\skillLegend@FontSize #5} & & \\[#2]% the spacing needs to be inside the cell for the vertical rule to extend correctly + \end{tabular}% + \endgroup% + \par\@aftersectionfalse\ignorespaces% + }% + % because of this weird style and the position of the parameter [#2], the dashed lines of the other version look bad. So no lines. + \IfBooleanTF#1{% + \@starIndependentTabular% + }{% + \@starIndependentTabular% + }% + }% +\fi + +% %------------------------------------------------------------------------------- +% % \cvskillhead +% %------------------------------------------------------------------------------- +\NewDocumentCommand\cvSkillMatrix@HeadFont{}{\normalfont} +\DeclareDocumentCommand\cvskillhead{+O{} +O{} +O{} +O{} +O{}}{}% +% add skill matrix line acting as header explaining the meaning of columns. +% +% Input: +% input_1 (optional): padding length appended to the legend, default: <0.25em> +% input_2 (optional): string naming the level column (2nd column), default: <Level> +% input_3 (optional): string naming the skill column (3nd column), default: <Skill> +% input_4 (optional): string naming the experience-in-years column (4th column), default: <Years> +% input_5 (optional): string naming the comment column (5th column), default: <Comment> +% +% Example usages: +% \cvskillhead print default head. +% \cvskillhead[0.5em] print default head, but adjust post padding. +% \cvskillhead[0.25em][Level][F\"ahigkeit][Jahre][Bemerkung] Fully adjust head to German example +% +% Note: +% - The width of the columns can be adjusted by the \setcvskillcolumns command, see \setcvskillcolumns. + +\NewDocumentCommand\skillMatrix@HeaderDefaultOne{}{Level} +\NewDocumentCommand\skillMatrix@HeaderDefaultTwo{}{Skill} +\NewDocumentCommand\skillMatrix@HeaderDefaultThree{}{Years} +\NewDocumentCommand\skillMatrix@HeaderDefaultFour{}{Comment} +% Definition of \cvskillhead valid for moderncvbodyi, moderncvbodyii, moderncvbodyiii, moderncvbodyiv +\RenewDocumentCommand\cvskillhead{O{.25em} +O{\skillMatrix@HeaderDefaultOne} +O{\skillMatrix@HeaderDefaultTwo} +O{\skillMatrix@HeaderDefaultThree} +O{\skillMatrix@HeaderDefaultFour}}{% + \begingroup + \renewcommand{\arraystretch}{1.25} + \arrayrulecolor{color1} + \begin{tabular}{@{}p{\skillmatrix@hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}% + p{\cvskill@width}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@descriptorwidth}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@experiencewidth}@{\hspace{\skillmatrix@padding}} + p{\skillmatrix@commentwidth}@{}}% + & \centering{\cvSkillMatrix@HeadFont #2} & \centering{\cvSkillMatrix@HeadFont #3} & \centering{\cvSkillMatrix@HeadFont #4} & {\cvSkillMatrix@HeadFont #5} + \end{tabular}% + \endgroup + \par\addvspace{#1} +} +% Definition of \cvskillhead valid moderncvbodyv +\if@moderncvbodyv% + \RenewDocumentCommand\cvskillhead{O{.25em} +O{\skillMatrix@HeaderDefaultOne} +O{\skillMatrix@HeaderDefaultTwo} +O{\skillMatrix@HeaderDefaultThree} +O{\skillMatrix@HeaderDefaultFour}}{% + \arrayrulecolor{color1}% + \setlength\arrayrulewidth{\separatorrulewidth}% + \vspace*{-\separatorrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :( + \begingroup% + % \renewcommand{\arraystretch}{1.25}% + \begin{tabular}[t]{@{}p{\hintscolumnwidth}% + @{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}% + p{\skillmatrix@hintscolumnwidth}% + @{\hspace{\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@descriptorwidth}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@experiencewidth}@{\hspace{\skillmatrix@padding}}% + p{\skillmatrix@commentwidth}@{}}% + & & \centering{\cvSkillMatrix@HeadFont#2} & \centering{\cvSkillMatrix@HeadFont#3} & \centering{\cvSkillMatrix@HeadFont#4} & {\cvSkillMatrix@HeadFont#5} \\[#1]% the spacing needs to be inside the cell for the vertical rule to extend correctly + \end{tabular}% + \endgroup% + \par\@aftersectionfalse\ignorespaces% + }% +\fi + +% %------------------------------------------------------------------------------- +% % \cvskillentry +% %------------------------------------------------------------------------------- +% \cvskillentry[*][<post_padding>]{<skill_cathegory>}{<0-5>}{<skill_name>}{<years_of_experience>}{<comment>}% +\DeclareDocumentCommand\cvskillentry{s +O{} +m +m +m +m +m}{}% +% add cvskill matrix row. +% +% Input: +% asterix (optional): include horizontal (dashed) line above the entered line. This behaviour depends on the body style. +% For the fancy style, the asterix has no meaning. +% input_1 (optional): padding length appended to the legend, default: <0.25em> +% input_2: string, naming skill cathegory, default: <> +% input_3: integer between 0 and 5, describing level of skill. \cvskill{input_2} is called internally, default: <> +% input_4: string, naming the skill, default: <> +% input_5: positive real number, stating the number of years of experience with this skill , default: <> +% input_6: string, explaining details w.r.t. that particual skill default: <> +% +% Example usages: +% \cvskillentry*{Language:}{3}{Python}{2}{I have done a million projects with Python} +% \cvskillentry{}{2}{Lilypond}{14}{So much sheet music! Man I'm the best!} +% \cvskillentry{}{3}{\LaTeX}{14}{Clearly I rock at \LaTeX} +% \cvskillentry*[1.5em]{OS:}{3}{Linux}{2}{I only use Archlinux} +% +% Note: +% - The width of the columns can be adjusted by the \setcvskillcolumns command, see \setcvskillcolumns. + +% Definition of \cvskillentry valid for moderncvbodyi, moderncvbodyii, moderncvbodyiii, moderncvbodyiv +\RenewDocumentCommand\cvskillentry{s +O{.25em} +m +m +m +m +m}{% + %test for the star * in the command + \IfBooleanTF{#1}{% If a star is seen a dotted line is drawn above the entry + \begingroup + \renewcommand{\arraystretch}{1.25} + \arrayrulecolor{color1} + \begin{tabular}{@{}p{\skillmatrix@hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}% + p{\cvskill@width}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@descriptorwidth}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@experiencewidth} @{\hspace{\skillmatrix@padding}}% + p{\skillmatrix@commentwidth}@{}}% + \cdashline{2-5}[.6pt/1pt] + \raggedleft\hintstyle{#3} &\centering \cvskill{#4} &\centering {#5} & \centering {#6} &{\itshape#7}% + \end{tabular}% + \endgroup + \par\addvspace{#2} + }{% If no star is seen no line is drawn + \begin{tabular}{@{}p{\skillmatrix@hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}% + p{\cvskill@width}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@descriptorwidth}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@experiencewidth}% + @{\hspace{\skillmatrix@padding}}% + p{\skillmatrix@commentwidth}@{}}% + \raggedleft\hintstyle{#3} &\centering \cvskill{#4} &\centering {#5} & \centering {#6} &{\itshape#7}% + \end{tabular}% + \par\addvspace{#2} + } +} + +% Definition of \cvskillentry valid for moderncvbodyv +\if@moderncvbodyv% + \DeclareDocumentCommand\@starIndependentMatrixEntry{}{}% + \RenewDocumentCommand\cvskillentry{s O{.25em} +m +m +m +m +m}{% + \arrayrulecolor{color1}% + \setlength\arrayrulewidth{\separatorrulewidth}% + \vspace*{-\separatorrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :( + %test for the star * in the command + \RenewDocumentCommand{\@starIndependentMatrixEntry}{}{% + \begingroup% + \renewcommand{\arraystretch}{1.25}% + \begin{tabular}[t]{@{}p{\hintscolumnwidth}% + @{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}p{\skillmatrix@hintscolumnwidth} + @{\hspace{\skillmatrix@padding}}% + p{\cvskill@width}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@descriptorwidth}@{\hspace{\skillmatrix@padding}}% + p{\cvskill@experiencewidth} @{\hspace{\skillmatrix@padding}}p{\skillmatrix@commentwidth}@{}}% + % \cline{3-6}% + & \raggedleft\hintstyle{#3} &\centering \cvskill{#4} &\centering {#5} & \centering {#6} &{\itshape#7}\\[#2]% + \end{tabular}% + \endgroup% + }% + \IfBooleanTF{#1}{% the star does not do anything here + \@starIndependentMatrixEntry% + }{% + \@starIndependentMatrixEntry% + }% + \par\@aftersectionfalse\ignorespaces% + }% +\fi +% +\endinput + + +%% end of file `moderncvskillmatrix.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvstylebanking.sty b/public/lib/templates/template7/inputs/moderncvstylebanking.sty new file mode 100644 index 00000000..afc20e53 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvstylebanking.sty @@ -0,0 +1,75 @@ +%% start of file `moderncvstylebanking.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvstylebanking}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: banking] + +% body rules type options: "fullrules", "shortrules", "mixedrules" (default) or "norules" +\@initializecommand{\moderncvstylebodyoptions}{} +\DeclareOption{fullrules} {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,fullrules}} +\DeclareOption{shortrules} {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,shortrules}} +\DeclareOption{mixedrules} {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,mixedrules}} +\DeclareOption{norules} {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,norules}} + +% body section alignment options: "left" (default), "center" or "right" +\DeclareOption{left} {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,left}} +\DeclareOption{center} {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,center}} +\DeclareOption{right} {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,right}} + +% toggle use of symbol fonts. +\@initializeif{\if@symbols}\@symbolsfalse +\DeclareOption{symbols} {\@symbolstrue} +\DeclareOption{nosymbols} {\@symbolsfalse} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{mixedrules,left,symbols} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + + +%------------------------------------------------------------------------------- +% fonts & icons +%------------------------------------------------------------------------------- +% TeX Gyre Pagella font +%\ifxetexorluatex +% \setmainfont{Tex-Gyre Pagella} +% \setsansfont{Tex-Gyre Pagella} +% \setmathfont{Tex-Gyre Pagella} +% \setmathfont[range=\mathit,\mathsfit]{Tex-Gyre Pagella Italic} +% \setmathfont[range=\mathbfup,\mathbfsfup]{Tex-Gyre Pagella Bold} +% \setmathfont[range=\mathbfit,\mathbfsfit]{Tex-Gyre Pagella Bold Italic} +%\else + \IfFileExists{tgpagella.sty}% + {% + \RequirePackage{tgpagella}% + \renewcommand*{\familydefault}{\rmdefault}}% + {} +%\fi + +% symbols +\if@symbols + \moderncvicons{symbols} % use symbols +\else + \moderncvicons{letters} % do not use symbols, use letters +\fi + + + +%------------------------------------------------------------------------------- +% header, body & footer +%------------------------------------------------------------------------------- +\moderncvhead{3} +\moderncvbody[\moderncvstylebodyoptions]{3} + + +\endinput + + +%% end of file `moderncvstylebanking.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvstylecasual.sty b/public/lib/templates/template7/inputs/moderncvstylecasual.sty new file mode 100644 index 00000000..eba5df69 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvstylecasual.sty @@ -0,0 +1,62 @@ +%% start of file `moderncvstylecasual.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvstylecasual}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: casual] + +% head section alignment options: "left" (default) or "right" +\@initializecommand{\moderncvstyleheadoptions}{} +\DeclareOption{left} {\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,left}} +\DeclareOption{right}{\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,right}} + +% toggle use of symbol fonts. +\@initializeif{\if@symbols}\@symbolsfalse +\DeclareOption{symbols} {\@symbolstrue} +\DeclareOption{nosymbols} {\@symbolsfalse} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{right,symbols} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + +%------------------------------------------------------------------------------- +% fonts & icons +%------------------------------------------------------------------------------- +% Latin Modern fonts +%\ifxetexorluatex +% \setmainfont{Latin Modern Roman} +% \setsansfont{Latin Modern Sans} +% \setmathfont{Latin Modern Math} +%\else +% \IfFileExists{lmodern.sty}% +% {\RequirePackage{lmodern}}% +% {} +%\fi + +% symbols +\if@symbols + \moderncvicons{symbols} % use symbols +\else + \moderncvicons{letters} % do not use symbols, use letters +\fi + + +%------------------------------------------------------------------------------- +% header, body & footer +%------------------------------------------------------------------------------- +\moderncvhead[\moderncvstyleheadoptions]{2} +\moderncvbody{1} +\moderncvfoot{1} + + +\endinput + + +%% end of file `moderncvstylecasual.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvstyleclassic.sty b/public/lib/templates/template7/inputs/moderncvstyleclassic.sty new file mode 100644 index 00000000..3018cc67 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvstyleclassic.sty @@ -0,0 +1,61 @@ +%% start of file `moderncvstyleclassic.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvstyleclassic}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: classic] + +% head section alignment options: "left" (default) or "right" +\@initializecommand{\moderncvstyleheadoptions}{} +\DeclareOption{left} {\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,left}} +\DeclareOption{right}{\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,right}} + +% toggle use of symbol fonts. +\@initializeif{\if@symbols}\@symbolsfalse +\DeclareOption{symbols} {\@symbolstrue} +\DeclareOption{nosymbols} {\@symbolsfalse} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{left,symbols} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + +%------------------------------------------------------------------------------- +% fonts & icons +%------------------------------------------------------------------------------- +% Latin Modern fonts +%\ifxetexorluatex +% \setmainfont{Latin Modern Roman} +% \setsansfont{Latin Modern Sans} +% \setmathfont{Latin Modern Math} +%\else +% \IfFileExists{lmodern.sty}% +% {\RequirePackage{lmodern}}% +% {} +%\fi + +% symbols +\if@symbols + \moderncvicons{symbols} % use symbols +\else + \moderncvicons{letters} % do not use symbols, use letters +\fi + + +%------------------------------------------------------------------------------- +% header, body & footer +%------------------------------------------------------------------------------- +\moderncvhead[\moderncvstyleheadoptions]{1} +\moderncvbody{1} + + +\endinput + + +%% end of file `moderncvstyleclassic.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvstyleempty.sty b/public/lib/templates/template7/inputs/moderncvstyleempty.sty new file mode 100644 index 00000000..a8656052 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvstyleempty.sty @@ -0,0 +1,50 @@ +%% start of file `moderncvstyleempty.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvstyleempty}[2022-02-21 v2.3.1 modern curriculum vitae scheme: empty] + +%------------------------------------------------------------------------------- +% required packages +%------------------------------------------------------------------------------- + +%------------------------------------------------------------------------------- +% package options +%------------------------------------------------------------------------------- +% toggle use of symbol fonts. +\@initializeif{\if@symbols}\@symbolsfalse +\DeclareOption{symbols} {\@symbolstrue} +\DeclareOption{nosymbols} {\@symbolsfalse} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{symbols} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + +%------------------------------------------------------------------------------- +% style definition +%------------------------------------------------------------------------------- + +%------------------------------------------------------------------------------- +% fonts & icons +%------------------------------------------------------------------------------- +% symbols +\if@symbols + \moderncvicons{symbols} % use symbols +\else + \moderncvicons{letters} % do not use symbols, use letters +\fi + +% see moderncv.cls for command declarations that needs to be implemented, e.g. \maketitle, \section, \subsections, \cvline, etc + +\endinput + + +%% end of file `moderncvstyleempty.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvstylefancy.sty b/public/lib/templates/template7/inputs/moderncvstylefancy.sty new file mode 100644 index 00000000..56de6361 --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvstylefancy.sty @@ -0,0 +1,57 @@ +%% start of file `moderncvstylefancy.sty'. +%% Copyright 2015-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvstylefancy}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: fancy] + +% toggle use of symbol fonts. +\@initializeif{\if@symbols}\@symbolsfalse +\DeclareOption{symbols} {\@symbolstrue} +\DeclareOption{nosymbols} {\@symbolsfalse} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{symbols} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + +%------------------------------------------------------------------------------- +% fonts & icons +%------------------------------------------------------------------------------- +% EB Garamond font +%\ifxetexorluatex +% \setmainfont{EB Garamond} +% \setsansfont{EB Garamond} +% \setmathfont{EB Garamond} +%\else + \IfFileExists{ebgaramond.sty}% + {\RequirePackage{ebgaramond}}% + {} +%\fi + + +% symbols +\if@symbols + \moderncvicons{symbols} % use symbols +\else + \moderncvicons{letters} % do not use symbols, use letters +\fi + + +%------------------------------------------------------------------------------- +% header, body & footer +%------------------------------------------------------------------------------- +\moderncvhead{5} +\moderncvbody{5} + + +\endinput + + +%% end of file `moderncvstylefancy.sty'. diff --git a/public/lib/templates/template7/inputs/moderncvstyleoldstyle.sty b/public/lib/templates/template7/inputs/moderncvstyleoldstyle.sty new file mode 100644 index 00000000..78225e0a --- /dev/null +++ b/public/lib/templates/template7/inputs/moderncvstyleoldstyle.sty @@ -0,0 +1,63 @@ +%% start of file `moderncvstyleoldstyle.sty'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +%------------------------------------------------------------------------------- +% identification +%------------------------------------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{moderncvstyleoldstyle}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: oldstyle] + +% toggle use of symbol fonts. +\@initializeif{\if@symbols}\@symbolsfalse +\DeclareOption{symbols} {\@symbolstrue} +\DeclareOption{nosymbols} {\@symbolsfalse} + +\DeclareOption*{}% avoid choking on unknown options +\ExecuteOptions{symbols} +\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package + +%------------------------------------------------------------------------------- +% fonts & icons +%------------------------------------------------------------------------------- +% Kurier font +%\ifxetexorluatex +% \setmainfont[Numbers={OldStyle,Proportional}, BoldFont={Kurier Bold}, ItalicFont={Kurier Light Italic}, BoldItalicFont={Kurier Bold Italic}]{Kurier Light} +% \setsansfont[Numbers={OldStyle,Proportional}, BoldFont={Kurier Bold}, ItalicFont={Kurier Light Italic}, BoldItalicFont={Kurier Bold Italic}]{Kurier Light} +% \setmathfont{Kurier Light} +% \setmathfont[range=\mathit,\mathsfit]{Kurier Light Italic} +% \setmathfont[range=\mathbfup,\mathbfsfup]{Kurier Bold} +% \setmathfont[range=\mathbfit,\mathbfsfit]{Kurier Bold Italic} +%\else + \IfFileExists{kurier.sty}% + {\RequirePackage[light,math]{kurier}}% + {} +%\fi + +% symbols +\if@symbols + \ifxetexorluatex + \moderncvicons{awesome} % use font-awesome symbols if lualatex or xelatex is used + \else + \moderncvicons{marvosym} % use marvosym symbols pdflatex is used + \fi +\else + \moderncvicons{letters} % do not use symbols, use letters +\fi + + +%------------------------------------------------------------------------------- +% header, body & footer +%------------------------------------------------------------------------------- +\moderncvhead{4} +\moderncvbody{4} + + +\endinput + + +%% end of file `moderncvstyleoldstyle.sty'. diff --git a/public/lib/templates/template7/inputs/picture.eps b/public/lib/templates/template7/inputs/picture.eps new file mode 100644 index 00000000..e7415b00 --- /dev/null +++ b/public/lib/templates/template7/inputs/picture.eps @@ -0,0 +1,958 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (picture.eps) +%%CreationDate: (2012-03-25T00:18:42-04:00) +%%BoundingBox: 0 0 94 94 +%%HiResBoundingBox: 0 0 94 94 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 1 +%%EndComments + +%%BeginDefaults +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-none or 1-RunlengthEncoded. + % hex color packets. + % + gsave + /buffer 512 string def + /byte 1 string def + /color_packet 3 string def + /pixels 768 string def + + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Times-Roman findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 94 94 +userdict begin +DisplayImage +0 0 +94 94 +12 +94 94 +0 +0 +E8EBF0E8EBF0E8EBF0E8EBF0E8EBF2E7EAF1E6E9F0E6E9F0E6EBEFE5EAEEE4E9EDE4E9EDE4E9ED +E3E8ECE2E7EBE0E5E9DFE3EEDEE2EDDEE2EDDDE1ECDEE2EDDDE1ECDBDFEADADEE9DBE0E6DBE0E6 +DADFE5DADFE5D9DEE4D8DDE3D7DCE2D7DCE2D2D8E4D2D8E4D1D7E3D0D6E2CFD5E1CED4E0CED4E0 +CDD3DFCBD3E0CAD2DFC8D0DDC7CFDCC7CFDCC7CFDCC6CEDBC5CDDAC8D0DDC7CFDCC5CDDAC5CDDA +C5CDDAC4CCD9C3CBD8C1C9D6C1CBD5C0CAD4C0CAD4BFC9D5BEC8D4BDC7D3BCC5D4BBC4D3B9C1D6 +B9C1D6B8C0D5B7BFD6B6BED5B5BDD4B4BCD3B4BBD5B3BAD4B3BAD4B2B9D3B1B8D2B0B7D1B0B7D1 +AFB6D0AFB6D0ABB5D0AAB4CFA9B3CEA8B2CDA8B2CDA7B1CCA6B0CBA5AFCAA6B0CBA6AFCCA2ADCB +A0ABC9A2ABC8A7AEC8EAEDF2EAEDF2EAEDF2EAEDF2EAEDF4E9ECF3E8EBF2E8EBF2E7ECF2E6EBF1 +E6EBF1E5EAF0E6EBF1E5EAF0E3E8EEE2E7EDE1E5F0E1E5F0E0E4EFE0E4EFE0E4EFDFE3EEDDE1EC +DCE0EBD9DFEBD9DFEBD8DEEAD7DDE9D7DDE9D6DCE8D5DBE7D5DBE7D3D9E5D3D9E5D2D8E4D1D7E3 +D0D6E2CFD5E1CED4E0CED4E0CDD4E4CCD3E3CAD1E1CAD1E1CAD1E1CAD1E1C9D0E0C8CFDFC7CEE0 +C6CDDFC4CBDDC4CBDDC4CBDDC3CADCC2C9DBC0C7D9BCC7D9BCC7D9BBC6D8BAC5D7B9C4D8B8C3D7 +B7C2D6B7C2D6B6C0DBB6C0DBB5BFDAB4BED9B3BCD9B2BBD8B1BAD7B1BAD7AFB8D9AFB8D9AEB7D8 +ADB6D7ACB5D6ACB5D6ABB4D5ABB4D5AAB5D5A9B4D4A8B3D3A7B2D2A7B2D2A6B1D1A5B0D0A4AFCF +A4AFCFA1AED09FACCF9DAACDA1ABCEA5AECDEBEEF3EBEEF3EBEEF3EBEEF5EBEEF5EAEDF4E9ECF5 +E9ECF5E8EDF3E7ECF2E6EBF1E6EBF1E6EBF1E5EAF0E3E8EEE2E7EDE2E6F1E1E5F0E0E4EFE0E4EF +E0E4EFE0E4EFDEE2EDDDE1ECD9DEF2D8DDF1D8DDF1D7DCF0D6DBEFD5DAEED5DAEED5DAEED3D9E9 +D3D9E9D2D8E8D1D7E7D0D6E6CFD5E5CFD5E5CED4E4CED5E7CDD4E6CBD2E4CBD2E4CBD2E4CBD2E4 +C9D0E2C8CFE1C5CDE2C4CCE1C2CADFC2CADFC2CADFC1C9DEC0C8DDBFC7DCBAC6DEBAC6DEB9C5DF +B8C4DEB7C3DDB6C1DDB5C0DCB5C0DCB5C0DEB4BFDDB3BEDCB2BDDBB1BCDCB0BBDBB0BBDBAFBADA +ADB7DBADB7DBACB6DAABB5D9ABB5D9AAB4D8A9B3D7A9B3D7A7B5DAA6B4D9A4B2D7A4B2D7A4B2D7 +A3B1D6A2B0D5A0AED39FADD09EAED29DACD39AA9D09BABCFA1AED0E9ECF1E9ECF1E9ECF3E9ECF3 +E9ECF3E8EBF4E7EAF3E7EAF3E5E9F2E5E9F2E4E8F1E4E8F1E4E8F1E3E7F0E1E5EEE0E4EDDFE5F1 +DEE4F0DDE3EFDDE3EFDDE3EFDCE2EEDAE0ECD9DFEBD8DDF0D8DDF0D7DCEFD7DCEFD6DBEED5DAED +D4D9ECD4D9ECD2D9EBD1D8EAD1D8EAD0D7E9CFD6E8CED5E7CDD4E6CDD4E6CCD3E6CBD2E5CAD1E4 +CAD1E4CAD1E4C9D0E3C8CFE2C6CDE0C5CCE6C4CBE5C2C9E3C2C9E3C2C9E3C1C8E2C0C7E1BEC5DF +B9C7E1B8C6E0B8C6E0B7C5E0B6C4DFB5C3DEB4C2DDB4C2DFB3C1DCB2C0DBB1BFDAB1BFDCAFBDDA +AFBDDAAEBBDBADBADAABB9DCABB9DCABB9DCAAB8DBA9B7DAA8B6D9A8B6D9A7B5D8A4B6DAA3B5D9 +A1B3D7A1B3D7A0B2D6A0B2D69EB0D49DAFD39CAFCF9CAFD09AAED197ABCE98ABCC9DAECCE8EBF2 +E8EBF2E8EBF2E8EBF2E8EBF4E7EAF3E6E9F2E6E9F2E4E8F1E3E7F0E2E6EFE2E6EFE2E6EFE2E6EF +E0E4EDDFE3ECDDE3EFDCE2EEDBE1EDDBE1EDDBE1EDDBE1EDD9DFEBD8DEEAD7DFECD6DEEBD6DEEB +D5DDEAD4DCE9D3DBE8D3DBE8D3DBE8D1D8EBD0D7EAD0D7EACFD6E9CED5E8CDD4E7CCD3E6CBD2E5 +CAD2E7C9D1E6C8D0E5C8D0E5C8D0E5C7CFE4C6CEE3C4CCE1C5CCE8C4CBE7C2C9E5C2C9E5C2C9E5 +C1C8E4C0C7E3BFC6E2B9C8DDB9C8DDB8C7DEB7C6DDB6C5DCB5C3DDB5C3DDB4C2DCB3C2D9B3C2D9 +B2C1D8B1C0D7B0BED8AFBDD7AEBCD6AEBCD6ACBBD8ACBBD8ABBAD7AAB9D6A9B8D5A9B8D5A8B7D4 +A8B7D4A4B7D7A2B5D5A1B4D4A0B3D3A0B3D3A0B3D39EB1D19DB0D09CB0CB9CB1CE9BB0CF97ACCB +96ABC89BACC6E8EBF2E8EBF2E8EBF2E8EBF4E8EBF4E7EAF3E6E8F4E6E8F4E5E9F4E4E8F3E3E7F2 +E3E7F2E3E7F2E2E6F1E0E4EFDFE3EEDDE3EFDCE2EEDBE1EDDBE1EDDBE1EDDBE1EDD9DFEBD8DEEA +D6DEE9D6DEE9D5DDE8D5DDE8D4DCE7D3DBE6D2DAE5D2DAE5D0D7EAD0D7EACFD6E9CED5E8CDD4E7 +CCD3E6CBD2E5CBD2E5CAD2E7C9D1E6C9D1E6C9D1E6C9D1E6C8D0E5C6CEE3C4CCE1C3CDE6C2CCE5 +C0CAE3C0CAE3C0CAE3BFC9E2BEC8E1BCC6DFBBC8DBBAC6DCB9C5DBB8C4DAB7C3D9B6C2DAB6C2DA +B5C1D9B3C2D7B3C2D7B2C1D6B1C0D7B0BFD6AFBED5AEBDD4AEBCD6ABBBD5AABAD4AABAD4A9B9D3 +A8B8D2A8B8D2A7B7D1A7B7D1A5B6D2A4B5D1A3B4D0A2B3CFA2B3CFA1B2CEA0B1CD9FB0CC9EAFC9 +9DB1CC9CAFCD98ABC996AAC59BABC4E7EAF1E8EBF2E8EBF4E8EBF4E7EAF3E7E9F5E6E8F4E5E7F3 +E5E9F4E4E8F3E3E7F2E3E7F2E3E7F2E2E6F1E1E5F0DFE3EEDDE3F1DCE2F0DBE1EFDBE1EFDBE1EF +DAE0EED9DFEDD7DDEBD6DEEBD5DDEAD5DDEAD4DCE9D3DBE8D3DBE8D2DAE7D2DAE7D0D9EACFD8E9 +CED7E8CDD6E7CCD5E6CBD4E5CBD4E5CAD3E4C9D1E6C9D1E6C8D0E5C9D1E6C9D1E6C8D0E5C6CEE3 +C4CCE1C2CDE3C1CCE2BFCAE0BFCAE0BFCAE0BEC9DFBDC8DEBBC6DCBBC5DEBBC5DEBAC4DFB9C3DE +B8C2DDB7C1DCB6BFDCB6BFDCB4C0DAB4C0DAB3BFD9B2BDD9B1BCD8B0BBD7B0BBD9AFBAD8AAB9D6 +AAB9D6A9B8D5A8B7D4A8B7D4A7B6D3A6B5D2A6B5D2A6B5D6A5B4D5A3B2D3A3B2D3A3B2D3A2B1D2 +A1B0D19FAECF9DACCB9FAECF9EAED09AAACE9AA8CB9DABC8E6E9F0E6E9F2E7EAF3E7EAF3E6E9F2 +E5E7F3E5E7F3E4E6F2E4E8F4E3E7F3E2E6F2E2E6F2E2E6F2E2E6F2E0E4F0DEE2EEDBE3F0DAE2EF +D9E1EED9E1EED9E1EED8E0EDD7DFECD5DDEAD6DDEFD5DCEED5DCEED4DBEDD3DAECD2D9EBD2D9EB +D1D8EAD0D9EAD0D9EACFD8E9CED7E8CDD6E7CCD5E6CBD4E5CBD4E5C8D0E3C8D0E3C8D0E3C8D0E3 +C8D0E3C7CFE2C4CCDFC2CADDC1CCE0C0CBDFBEC9DDBEC9DDBEC9DDBDC8DCBCC7DBBAC5D9BEC5E2 +BEC4E4BDC3E3BCC2E2BBC1E1BAC0E2B9BFE1B9BFE1B4BFDFB3BEDEB2BDDDB1BCDCB0BADDAFB9DC +AFB9DCAEB8DBABB8D8ABB8D8ABB8D8AAB7D7A9B6D6A8B5D5A8B5D5A7B4D4A7B3D9A6B2D8A4B0D6 +A4B0D6A4B0D6A3AFD5A2AED4A0ACD29CA8CE9FABD39FABD59CA8D29BA7CFA1A9CEE5E9F2E5E9F2 +E5E9F2E5E9F2E5E9F4E4E8F3E3E7F2E3E7F2E2E5F4E2E5F4E2E5F4E1E4F3E1E4F3E0E3F2E0E3F2 +DFE2F1DBE1EFDBE1EFDBE1EFDAE0EED9DFEDD9DFEDD8DEECD8DEECD6DCECD6DCECD5DBEBD5DBEB +D4DAEAD3D9E9D2D8E8D2D8E8D1D8EAD0D7E9CFD6E8D0D7E9D1D8EAD1D8EACFD6E8CDD4E6C8D0E5 +CBD3E8CBD3E8C8D0E7C3CBE2C3CBE2C4CBE5C6CDE7C3D0E3C2CFE2C1CEE1BFCBE1BCC8DEBAC6DC +BAC6DEBBC7DFBBC7E1B9C5DFB8C4DEB7C3DDB7C2DEB7C2DEB5C0DCB4BFDBB2C0DDB1BFDCB0BEDB +AFBDDAAFBDDAAEBCD9ADBBD8ACBAD7AAB9D8AAB9D8A9B8D7A8B7D6A7B6D5A6B5D4A6B5D4A5B4D3 +A4B3D4A3B2D3A3B2D3A2B1D2A1B0D1A0AFD0A0AFD09FAECF9BADD59CAED29CACCD9BA9CC9CA8D0 +A0A9D2E4E8F1E4E8F1E4E8F1E4E8F1E4E8F3E3E7F2E2E6F1E2E6F1E2E5F4E2E5F4E1E4F3E1E4F3 +E0E3F2E0E3F2DFE2F1DFE2F1DBE1EFDBE1EFDAE0EEDAE0EED9DFEDD9DFEDD8DEECD8DEECD6DCEC +D6DCECD5DBEBD4DAEAD4DAEAD3D9E9D2D8E8D2D8E8D1D8EBCFD6E9CED5E8CCD3E6CBD2E5CAD1E4 +C8CFE2C7CEE1C5CDE2C7CFE4CAD2E7CBD3EAC9D1E8C7CFE6C3CBE2C0C7E1BBC7DDBBC7DDBBC7DD +BCC8DEBDC9E1BCC8E0BBC7DFB9C5DDBBC7E1B9C5DFB8C4DEB7C3DDB7C2DEB7C2DEB5C0DCB4BFDB +B2C0DDB1BFDCB0BEDBAFBDDAAFBDDAAEBCD9ADBBD8ACBAD7AAB9D8AAB9D8A9B8D7A8B7D6A7B6D5 +A6B5D4A6B5D4A5B4D3A4B3D4A3B2D3A3B2D3A2B1D2A1B0D1A0AFD0A0AFD09FAECF9BADD59CAED2 +9CACCD9BA9CC9CA8D0A0A9D2E3E7F0E3E7F0E3E7F0E3E7F0E3E7F2E2E6F1E1E5F0E1E5F0E1E4F3 +E1E4F3E1E4F3E0E3F2E0E3F2DFE2F1DFE2F1DEE1F0DBE1EFDAE0EEDAE0EED9DFEDD9DFEDD8DEEC +D8DEECD8DEECD6DCECD5DBEBD5DBEBD4DAEAD3D9E9D2D8E8D2D8E8D1D7E7CCD2E8CDD3E9CED4EA +CDD3E9CDD3E9CDD3E9CED4EACED4EACAD2E5C6CEE1C1C9DEBFC7DCC0C8DDC3CBE2C5CDE4C7CFE6 +C1CCE2BFCAE0BDC7E0BDC7E0BEC8E1BEC8E3BDC7E2BBC5E0BAC6E0B9C5DFB8C4DEB7C3DDB7C2DE +B6C1DDB5C0DCB4BFDBB2C0DDB1BFDCAFBDDAAFBDDAAFBDDAAEBCD9ADBBD8ABB9D6AAB9D8AAB9D8 +A9B8D7A8B7D6A7B6D5A6B5D4A5B4D3A5B4D3A3B2D3A3B2D3A2B1D2A2B1D2A1B0D1A0AFD0A0AFD0 +9FAECF9BADD59BADD19CACCD9BA9CC9CA8D0A0A9D2E2E6EFE3E7F0E3E7F0E3E7F0E2E6F1E2E6F1 +E1E5F0E0E4EFE1E4F3E0E3F2E0E3F2DFE2F1DFE2F1DEE1F0DEE1F0DEE1F0DAE0EEDAE0EEDAE0EE +D9DFEDD8DEECD8DEECD7DDEBD7DDEBD5DBEBD5DBEBD4DAEAD3D9E9D3D9E9D2D8E8D1D7E7D1D7E7 +D1D7EDD2D8EED2D8EECFD5EBCBD1E7C8CEE4C7CDE3C8CEE4C5CDE0C5CDE0C8D0E3CBD3E6CBD3E8 +C8D0E5C4CCE1C3CBE0C4CEE7C2CCE5BEC8E1BCC6DFBBC5E0BCC6E1BDC7E2BEC8E3BAC6E0B9C5DF +B7C3DDB7C3DDB7C2DEB6C1DDB5C0DCB3BEDAB2C0DDB1BFDCAFBDDAAFBDDAAEBCD9AEBCD9ACBAD7 +ABB9D6AAB9D8A9B8D7A9B8D7A8B7D6A7B6D5A6B5D4A5B4D3A5B4D3A3B2D3A3B2D3A2B1D2A1B0D1 +A1B0D1A0AFD09FAECF9FAECF9AACD49BADD19CACCD9AA8CB9BA7CFA0A9D2E2E6EFE3E7F0E3E7F0 +E3E7F0E2E6F1E1E5F0E1E5F0E0E4EFE0E3F2E0E3F2DFE2F1DFE2F1DEE1F0DDE0EFDDE0EFDDE0EF +DAE0EED9DFEDD9DFEDD8DEECD8DEECD7DDEBD7DDEBD7DDEBD5DBEBD4DAEAD4DAEAD3D9E9D2D8E8 +D1D7E7D1D7E7D0D6E6CCD2E8CDD3E9CED4EACDD3E9CAD0E6C9CFE5CAD0E6CBD1E7CDD4E6C9D0E2 +C4CBDDC1C8DBBCC3D6BAC1D4BFC5DBC6CCE2BDC8DEBFCAE0C0CAE3BEC8E1BCC6DFBAC4DFBBC5E0 +BDC7E2BAC6E0B9C5DFB7C3DDB7C3DDB6C1DDB6C1DDB4BFDBB3BEDAB2C0DDB0BEDBAFBDDAAEBCD9 +AEBCD9AEBCD9ACBAD7ABB9D6AAB9D8A9B8D7A8B7D6A8B7D6A6B5D4A6B5D4A5B4D3A4B3D2A3B2D3 +A3B2D3A2B1D2A1B0D1A0AFD0A0AFD09FAECF9FAECF9AACD49BADD19CACCD9AA8CB9BA7CFA0A9D2 +E2E6EFE2E6EFE2E6EFE2E6EFE2E6F1E1E5F0E0E4EFE0E4EFDFE2F1DFE2F1DEE1F0DEE1F0DDE0EF +DDE0EFDCDFEEDCDFEED9DFEDD9DFEDD8DEECD8DEECD7DDEBD7DDEBD6DCEAD6DCEAD4DAEAD4DAEA +D3D9E9D2D8E8D2D8E8D1D7E7D0D6E6D0D6E6D1D8EBCFD6E9CCD3E6C9D0E3C7CEE1C7CEE1C9D0E3 +CBD2E5C2C9D9B3BACCA0A7B99198AA8A91A39097AAA3AABDB6BDD0B8C0D5BCC4D9C2CAE1C5CDE4 +C4CCE3C0C7E1BCC3DDBAC1DBBAC6E0B8C4DEB7C3DDB6C2DCB6C1DDB6C1DDB4BFDBB3BEDAB1BFDC +B0BEDBAFBDDAAEBCD9AEBCD9ADBBD8ACBAD7ABB9D6A9B8D7A9B8D7A8B7D6A7B6D5A6B5D4A5B4D3 +A5B4D3A4B3D2A3B2D3A2B1D2A2B1D2A1B0D1A0AFD09FAECF9FAECF9EADCE9AACD49BADD19BABCC +9AA8CB9BA7CF9FA8D1E1E5EEE1E5EEE1E5EEE1E5EEE1E5F0E0E4EFDFE3EEDFE3EEDFE2F1DEE1F0 +DEE1F0DDE0EFDDE0EFDCDFEEDCDFEEDBDEEDD9DFEDD9DFEDD8DEECD7DDEBD7DDEBD6DCEAD6DCEA +D6DCEAD4DAEAD3D9E9D3D9E9D2D8E8D1D7E7D0D6E6D0D6E6CFD5E5D7DEEECDD4E4BEC5D5B0B7C7 +A6ADBDA2A9B9A1A8B8A1A8B8939AAA8A91A1838A9A8087997C83957A819381889B8A91A49CA4B7 +9FA7BAA8B0C3B3BBD0BCC4D9C0C8DDBDC5DCBAC2D9B9C5DFB8C4DEB7C3DDB6C2DCB6C1DDB5C0DC +B4BFDBB3BEDAB1BFDCB0BEDBAEBCD9AEBCD9AEBCD9ADBBD8ACBAD7AAB8D5A9B8D7A9B8D7A8B7D6 +A7B6D5A6B5D4A5B4D3A4B3D2A4B3D2A2B1D2A2B1D2A1B0D1A1B0D1A0AFD09FAECF9FAECF9EADCE +9AACD49AACD09BABCC9AA8CB9BA7CF9FA8D1E0E4EDE0E4EDE0E4EDE0E4EDE0E4EFDFE3EEDEE2ED +DEE2EDDEE1F0DEE1F0DEE1F0DDE0EFDCDFEEDCDFEEDBDEEDDBDEEDD9DFEDD8DEECD8DEECD7DDEB +D7DDEBD6DCEAD6DCEAD5DBE9D3D9E9D3D9E9D3D9E9D2D8E8D1D7E7D0D6E6D0D6E6CFD5E5B4BBCB +A7AEBE949BAB848B9B7C83937B82927D84947F86968289997C83937B829280879781889A7E8597 +7E859782899B717A8B737C8D7C84979098ABA8B0C3B9C1D6BFC7DCBEC6DBB9C5DFB8C4DEB7C3DD +B6C2DCB6C1DDB5C0DCB4BFDBB3BEDAB1BFDCB0BEDBAEBCD9AEBCD9AEBCD9ADBBD8ACBAD7AAB8D5 +A9B8D7A9B8D7A8B7D6A7B6D5A6B5D4A5B4D3A4B3D2A4B3D2A2B1D2A2B1D2A1B0D1A1B0D1A0AFD0 +9FAECF9EADCE9EADCE99ABD39AACD09BABCC99A7CA9AA6CE9FA8D1DEE3E9E0E4EDE0E4EDDDE4EE +DCE3EDDEE4F0DDE3EFDAE2EFDBE1EDDBE1EDDBE1EDDAE0ECD9DFEBD9DFEBD8DEEAD8DEEAD6DCEC +D6DCECD6DCECD5DBEBD5DBEBD4DAEAD4DAEAD3D9E9DAE1F3D4DBEDCCD3E5D2D9EBCCD3E3CDD4E4 +D1D8E8B2B9C9979DAB8B919F838997858B99878D9B8389977E84927E84927F85957F85957F8595 +7F85957F85957E84947D83937D83937D84967D84967C83957980927C83958B92A4A3AABCB6BDCF +BAC5D9BBC6DCB4BFD5B8C4DCBAC6E0B6C1DDB7C2E0AEBCD9AFBDD8AEBCD7AEBCD7ADBBD8ACBAD7 +ABB9D6ABB8D8AAB7D7AAB9D6A9B8D5A9B8D7A8B7D6A7B6D5A6B5D6A5B4D5A5B4D5A2B0D3A2B0D3 +A1AFD2A1AFD2A0AED19FADD09FADD09EACCF98ABD599ADD299ACCD99A9CD9AA7D19EAAD2DDE2E8 +DFE3ECDFE3ECDCE3EDDBE2ECDDE3EFDCE2F0D9E1EEDAE0ECDAE0ECDAE0ECD9DFEBD8DEEAD8DEEA +D7DDE9D7DDE9D6DCECD6DCECD5DBEBD5DBEBD4DAEAD4DAEAD3D9E9D3D9E9D5DCEED2D9EBC8CFE1 +CCD3E5D3DAEAD5DCECC2C9D99097A7868C9A7F85937D8391808694828896808694808694838997 +8086968086968086968086967F85957F85957E84947E84947E85977E85977C83957A8193798092 +7D8496848B9D8B92A496A1B5B1BCD0BBC6DCB7C1DAADB9D3ADB8D4B5C0DEAEB9D7AFBDD8AEBCD7 +AEBCD7ADBBD8ACBAD7ABB9D6ABB8D8AAB7D7A9B8D5A8B7D4A8B7D6A7B6D5A6B5D4A5B4D5A4B3D4 +A4B3D4A2B0D3A2B0D3A1AFD2A1AFD2A0AED19FADD09EACCF9EACCF98ABD599ADD299ACCD99A9CD +9AA7D19EAAD2DCE0E9DEE2EBDEE2EBDAE1EBDAE0ECDCE2EEDBE1EFD8E0EDD9DFEDD9DFEDD9DFED +D8DEECD7DDEBD7DDEBD6DCEAD6DCEAD5DBEBD5DBEBD5DBEBD4DAEAD4DAEAD3D9E9D3D9E9D2D8E8 +CBD2E4D5DCEED1D8EAD0D7E9D2D9E9CAD1E1AEB5C5818898828896808694818795838997808694 +7C82907E84928389978086968086968086968086968086967F85957E84947E84947C83957B8294 +7A81937B82947A8193798092757C8E72798B7C8799A0ABBFB7C2D8BCC6DFB4C0DAB1BCD8B7C2DE +B2BDDBAEBCD7AEBCD7ADBBD6ADBBD8ACBAD7ABB9D6ABB8D8AAB7D7A8B7D4A8B7D4A7B6D5A6B5D4 +A5B4D3A4B3D4A3B2D3A3B2D3A2B0D3A2B0D3A1AFD2A0AED1A0AED19FADD09EACCF9EACCF97AAD4 +98ACD198ABCC98A8CC99A6D09DA9D1DBDFE8DDE1EADEE2EDDAE1EBDAE0ECDBE1EFDBE1EFD7DFEC +D9DFEDD8DEECD8DEECD7DDEBD7DDEBD6DCEAD6DCEAD6DCEAD5DBEBD4DAEAD4DAEAD3D9E9D3D9E9 +D2D8E8D2D8E8D2D8E8C9D0E2D3DAECD4DBEDD1D8EAC9D0E0B3BACA989FAF868D9D858B99858B99 +868C9A868C9A8187957C82907D83918187957F85958086968086968086967F85957F85957E8494 +7D83937A8193798092787F917A81937B82947B8294798092777E9071798C81899C929DB1AEB9CF +BAC4DDB4C0DAB2BDD9ABB6D2AEBCD7AEBCD7ADBBD6ACBAD7ACBAD7ABB9D6AAB7D7AAB7D7A8B7D4 +A7B6D3A7B6D5A6B5D4A5B4D3A4B3D4A3B2D3A3B2D3A2B0D3A2B0D3A1AFD2A0AED19FADD09FADD0 +9EACCF9EACCF95A8D296AACF96A9CA96A6CA98A5CF9CA8D0DBDFE8DDE1ECDEE2EDDAE0ECDAE0EC +DBE1EFDAE0F0D7DEEED9DFEDD8DEECD8DEECD7DDEBD7DDEBD6DCEAD6DCEAD6DCEAD4DAEAD4DAEA +D3D9E9D3D9E9D2D8E8D1D7E7D1D7E7D1D7E7D2D9EBCBD2E4CAD1E3CBD2E4BEC5D59CA3B3838A9A +848B9B8187958187958288968389978288968086948086948187957E84947F85957F85957F8595 +7E84947D83937D83937C82927B82947A81937A8193798092787F917980927980927A8193737C8D +727A8D777F92939EB2ADB8CEB4BED7B6C0DBACB8D2AEBCD7AEBCD7ADBBD6ACBAD7ABB9D6ABB9D6 +AAB7D7AAB7D7A8B7D4A8B7D4A7B6D5A6B5D4A5B4D3A4B3D4A3B2D3A3B2D3A2B0D3A1AFD2A1AFD2 +A0AED19FADD09EACCF9EACCF9DABCE96A9D397ABD097AACB97A7CB98A5CF9CA8D0DBDFEADDE1EC +DDE1ECD9DFEBD9DFEDDBE1EFDAE0F0D7DEEED8DEEED8DEEED8DEEED7DDEDD6DCECD6DCECD5DBEB +D5DBEBD3D9E9D3D9E9D2D8E8D2D8E8D1D7E7D1D7E7D0D6E6D0D6E6D3DAECCAD1E3CFD6E8C5CCDE +A7AEBE868D9D787F8F868D9D8187958187958086948187958288968288968187958086947E8494 +7E84947E84947E84947E84947D83937C82927C8292787F917A81937C83957B8294798092787F91 +7980927A81937780917A8394747C8F7D859A8F9AB0A6B0C9B9C3DCB6C0DBAEBCD7ADBBD6ADBBD6 +ACBAD7ABB9D6AAB8D5AAB7D7A9B6D6A8B7D4A7B6D3A7B6D5A6B5D4A5B4D3A4B3D4A3B2D3A3B2D3 +A1AFD2A1AFD2A0AED1A0AED19FADD09EACCF9DABCE9DABCE97AAD498ACD198ABCC98A8CC99A6D0 +9DA9D1DADEE9DCE0EBDCE0ECD8DEEAD8DEECD9DFEFD9DFEFD6DDEDD7DDEDD7DDEDD6DCECD6DCEC +D5DBEBD5DBEBD4DAEAD4DAEAD3D9E9D2D8E8D2D8E8D1D7E7D1D7E7D0D6E6D0D6E6CFD5E5CED5E7 +CCD3E5D3DAECB3BACC8990A07D84947D8494868D9D848A98848A98838997828896808694808694 +8086947F85937E84947E84947E84947E84947E84947D83937D83937C8292787F917A81937B8294 +7B82947B82947A81937A81937B8294737A8A7B8292737C8D6F778A747C918590A6A6B0C9B3BDD6 +ADBBD6ADBBD6ACBAD5ACBAD7ABB9D6AAB8D5AAB7D7A9B6D6A7B6D3A6B5D2A6B5D4A5B4D3A4B3D2 +A3B2D3A2B1D2A2B1D2A1AFD2A1AFD2A0AED19FADD09FADD09EACCF9DABCE9DABCE97AAD498ACD1 +98ABCC97A7CB98A5CF9BA7CFD9DDE8DBDFEADBDFEBD7DDE9D7DDEBD8DEEED8DEEED5DCECD6DCEC +D6DCECD5DBEBD5DBEBD4DAEAD4DAEAD3D9E9D3D9E9D2D8E8D2D8E8D2D8E8D1D7E7D0D6E6D0D6E6 +CFD5E5CFD5E5D1D8EACAD1E3C6CDDF979EB0747B8B858C9C878E9E7A81917E8492808694818795 +7F85937D83917E84928086948187957F85957F85957F85957F85957F85957E84947D83937D8393 +7E85977C8395798092787F91777E90777E90777E90777E907A81917C8393778091788093737B90 +777F9698A2BBB4BED7ADBBD6ADBBD6ACBAD5ACBAD7ABB9D6AAB8D5A9B6D6A9B6D6A6B5D2A5B4D1 +A5B4D3A4B3D2A3B2D1A2B1D2A1B0D1A1B0D1A1AFD2A1AFD2A0AED19FADD09FADD09EACCF9DABCE +9DABCE96A9D397ABD096A9CA95A5C995A2CC99A5CDD7DDE9DAE0EED8DEEED6DBEED8DFF1D6DDEF +D3DAEAD7DFECD4DBEDD4DBEDD3DAECD3DAECD2D9EBD2D9EBD1D8EAD1D8EAD1D8EBD0D7EACED5E8 +CED5E8CDD4E7CDD4E7CDD4E7CCD3E6CACFE2D8DEEEB0B6C68C92A2848A9A818795858B99808694 +8187958187958187958187958086948086947F85937F85937F85957F85957E84947E84947E8494 +7D83937D83937D83937B82947A8193798092798092787F91787F91787F91798092788095777E91 +777E907A7F92757C8E71798C8590A4AAB6CCA7B5CFB0BED8A5B3CEAAB8D5AEBDDCA5B4D5A8B6D9 +A3B1D4A7B6D7A5B4D5A4B3D4A3B2D3A3B1D4A3B1D4A1AFD2A0AED19EAED29EAED29DADD19DADD1 +9CACD09BABCF9AAACE9AAACE95A8D298ACD193A6C798A8CC98A5CF96A2CAD6DCE8D9DFEDD6DCEC +D5DAEDD7DEF0D5DCEED2D9E9D5DDEAD4DBEDD4DBEDD3DAECD3DAECD2D9EBD1D8EAD1D8EAD1D8EA +D2D9ECD0D7EACED5E8CFD6E9D0D7EAD0D7EACDD4E7CAD1E4D0D5E8C9CFDF9FA5B5848A9A808696 +818795888E9C8389978187958187958187958086948086948086947F85937F85937F85957F8595 +7E84947E84947D83937D83937D83937D83937A81937A8193798092798092787F91787F91787F91 +787F91747C91757C8F757C8E787D90767D8F70788B7A8599919DB3A5B3CDB2C0DAA6B4CFA7B5D2 +AEBDDCA8B7D8A9B7DAA7B5D8A7B6D7A5B4D5A4B3D4A3B2D3A3B1D4A3B1D4A1AFD2A0AED19EAED2 +9EAED29DADD19DADD19CACD09BABCF9AAACE9AAACE95A8D298ACD193A6C798A8CC98A5CF96A2CA +D5DBE7D8DEECD5DBEBD3D8EBD5DCEED4DBEDD1D8E8D4DCE9D3DAECD3DAECD3DAECD2D9EBD1D8EA +D1D8EAD0D7E9D0D7E9D1D8EBCFD6E9CDD4E7CED5E8D0D7EAD0D7EACCD3E6C9D0E3CFD4E7B1B7C7 +8B91A17F85957F8595828896898F9D8288968187958187958187958086948086947F85937F8593 +7F85937E84947E84947E84947D83937D83937D83937C82927C82927A81937A8193798092787F91 +787F91787F91787F91787F91727A8F757C8F747B8D767B8E777E9071798C6E798D768298A0AEC8 +B4C2DCAAB8D3A5B3D0ADBCDBAAB9DAA7B5D8A8B6D9A6B5D6A5B4D5A4B3D4A3B2D3A3B1D4A3B1D4 +A1AFD2A0AED19EAED29EAED29DADD19CACD09BABCF9BABCF9AAACE9AAACE95A8D298ACD193A6C7 +98A8CC98A5CF95A1C9D4DAE6D7DDEBD4DAEAD3D8EBD5DCEED3DAECD0D7E7D3DBE8D2D9EBD2D9EB +D2D9EBD1D8EAD1D8EAD0D7E9D0D7E9CFD6E8CDD4E7CDD4E7CCD3E6CCD3E6CDD4E7CCD3E6CCD3E6 +CBD2E5C4C9DC989EAE7F8595838999838999838997868C9A7D8391818795818795808694808694 +8086947F85937F85937F85937E84947E84947D83937D83937D83937C82927C82927C82927A8193 +7A8193798092787F91787F91787F91787F91787F91737B90787F92767D8F757A8D777E90747C8F +6B768A69758B93A1BBB0BED8AFBDD8A6B4D1ABBAD9A8B7D8A2B0D3A7B5D8A6B5D6A5B4D5A3B2D3 +A3B2D3A3B1D4A2B0D3A1AFD2A0AED19EAED29DADD19DADD19CACD09BABCF9AAACE9AAACE9AAACE +95A8D298ACD193A6C797A7CB98A5CF95A1C9D4DAE6D7DDEBD4DAEAD2D7EAD4DBEDD3DAECD0D7E7 +D3DBE8D2D9EBD1D8EAD1D8EAD0D7E9D0D7E9CFD6E8CFD6E8CFD6E8CBD2E5CDD4E7CDD4E7CCD3E6 +CAD1E4CAD1E4CCD3E6CFD6E9B6BBCE888E9E7C8292878D9D8389998288968389977D8391818795 +8086948086948086947F85937F85937F85937E84927D83937D83937D83937C82927C82927C8292 +7B81917B81917A8193798092798092787F91787F91777E90787F91787F91737B907A8194777E90 +73788B757C8E747C8F6E798D6B778D7F8DA79FADC7AEBCD7A8B6D3A9B8D7A7B6D7A0AED1A7B5D8 +A6B5D6A5B4D5A3B2D3A3B2D3A3B1D4A2B0D3A1AFD29FADD09DADD19DADD19DADD19CACD09BABCF +9AAACE9AAACE99A9CD94A7D197ABD093A6C797A7CB98A5CF95A1C9D3D9E5D6DCEAD3D9E9D2D7EA +D4DBEDD2D9EBCFD6E6D2DAE7D1D8EAD1D8EAD0D7E9D0D7E9CFD6E8CED5E7CED5E7CED5E7CCD3E6 +CED5E8CED5E8CCD3E6CAD1E4C9D0E3CCD3E6CED5E8A8ADC08288987E8494858B9B808696808694 +8187958288968086948086948086947F85937F85937F85937E84927E84927D83937D83937C8292 +7C82927C82927B81917B81917B8191798092798092787F91787F91777E90777E90777E90777E90 +71798E798093767D8F71768972798B727A8D6F7A8E707C926D7B958896B0A7B5D0AAB8D5A7B6D5 +A8B7D8A3B1D4A7B5D8A6B5D6A4B3D4A3B2D3A2B1D2A2B0D3A2B0D3A0AED19FADD09DADD19DADD1 +9CACD09CACD09BABCF9AAACE99A9CD99A9CD94A7D197ABD092A5C697A7CB97A4CE95A1C9D2D8E4 +D5DBE9D2D8E8D0D5E8D2D9EBD1D8EACED5E5D1D9E6D0D7E9D0D7E9D0D7E9CFD6E8CED5E7CED5E7 +CDD4E6CDD4E6CDD4E7CCD3E6CCD3E6CCD3E6CCD3E6CAD1E4C7CEE1C5CCDF999EB17F8595828898 +8389997F85958288967F85938389978086948086948086947F85937F85937E84927E84927E8492 +7C82927C82927C82927C82927B81917B81917A80907A8090798092798092787F91777E90777E90 +777E90777E90777E9070788D767D90737A8C71768972798B727A8D6E798D717D9367758F76849E +9DABC6A9B7D4A6B5D4AAB9DAA5B3D6A4B2D5A5B4D5A4B3D4A3B2D3A2B1D2A2B0D3A2B0D3A0AED1 +9FADD09DADD19DADD19CACD09BABCF9AAACE9AAACE99A9CD99A9CD94A7D197ABD092A5C697A7CB +97A4CE94A0C8D0D6E2D4DAE8D1D7E7CFD4E7D1D8EACFD6E8CDD4E4D0D8E5D0D7E9D0D7E9CFD6E8 +CFD6E8CED5E7CED5E7CDD4E6CDD4E6CDD4E7CAD1E4C8CFE2CAD1E4CDD4E7CAD1E4C2C9DCBAC1D4 +8E93A67D8393858B9B848A9A818797858B997D83918187958086948086948086947F85937F8593 +7E84927E84927E84927C82927C82927C82927B81917B81917B81917A80907A8090798092798092 +787F91777E90777E90777E90777E90777E9071798E747B8E72798B72778A757C8E727A8D6D788C +6F7B916977916D7B9597A5C0A9B7D4A4B3D2ABBADBA4B2D59EACCFA5B4D5A4B3D4A3B2D3A2B1D2 +A2B0D3A1AFD2A0AED19FADD09DADD19DADD19CACD09BABCF9AAACE9AAACE99A9CD99A9CD94A7D1 +97ABD092A5C697A7CB97A4CE94A0C8CFD6E0D0D6E2CFD6E6D0D7E9D0D7EACFD6E9CDD6E7CCD5E6 +CDD5E8CDD5E8CCD4E7CCD4E7CCD4E7CBD3E6CBD3E6CBD3E6C8D0E3CAD2E5CAD2E5C9D1E4CBD2E4 +C9D0E2CDD4E69DA4B67F85958086968187978288988288988288988187978187977F85957F8595 +7E84947E84947D83937C82927C82927C82927A81937A81937A8193798092798092787F91787F91 +787F91787F92787F92787F92777E91767D90767D90757C8F757C8F737B8E737B8E727A8D71798C +71798C70788B70788B70788B6F7B91707C9494A0BAAEBCD7AAB9D8A8B7D8A7B7D9A4B4D6A3B1D4 +A3B1D4A2B0D3A1AFD2A1AFD4A0AED39FADD29FADD29CABD29CABD29CABD29BAAD19AA9D099A8CF +99A8CF98A7CE95A8D394A7CF94A6CA95A4CB96A3CF97A3CDCED5DFCFD5E1CED5E5CFD6E8CFD6E9 +CED5E8CCD5E6CBD4E5CCD4E7CCD4E7CBD3E6CBD3E6CBD3E6CAD2E5CAD2E5CAD2E5C9D1E4CAD2E5 +C8D0E3C6CEE1C9D0E2C6CDDFC6CDDF949BAD8086968086968187978187978187978086967F8595 +7E84947F85957E84947E84947D83937D83937C82927C82927C82927A81937A81937A8193798092 +798092787F91787F91787F91787F92787F92777E91777E91767D90767D90757C8F757C8F737B8E +727A8D727A8D71798C71798C70788B70788B70788B6B778D67738B8692ACA2B0CBA3B2D1A0AFD0 +A1B1D39FAFD1A3B1D4A3B1D4A2B0D3A1AFD2A0AED3A0AED39FADD29FADD29CABD29CABD29BAAD1 +9BAAD19AA9D099A8CF98A7CE98A7CE94A7D293A6CE93A5C994A3CA95A2CE96A2CCCDD3DFCED4E2 +CDD4E4CED5E7CED5E8CDD4E7CBD4E5CAD3E4CBD3E6CBD3E6CAD2E5CAD2E5CAD2E5C9D1E4C9D1E4 +C9D1E4CCD4E9CBD3E6C8D0E3C7CFE2CAD1E4C6CDDFC6CDDF939AAC808696808696808696808696 +8086967F85957D83937C82927E84947E84947E84947D83937C82927C82927B81917B81917A8193 +7A8193798092798092798092787F91787F91787F91787F92777E91777E91767D90767D90757C8F +757C8F747B8E727A8D727A8D727A8D71798C71798C70788B70788B6F778A737F9569758D7E8AA4 +A0AEC9A8B7D6A5B4D5A6B6D8A6B6D8A2B0D3A2B0D3A2B0D3A1AFD2A0AED39FADD29FADD29EACD1 +9CABD29CABD29BAAD19AA9D099A8CF99A8CF98A7CE98A7CE93A6D192A5CD92A4C893A2C994A1CD +95A1CBCDD3DFCDD3E1CDD4E4CDD4E7CDD4E7CCD3E6CAD2E5CAD3E4CAD2E5CAD2E5CAD2E5C9D1E4 +C9D1E4C9D1E4C8D0E3C8D0E3C9D1E6C9D1E6C8D0E5C6CEE1C9D0E3C8CFE2CBD2E49AA1B37F8595 +7F85958086968086968086967F85957D83937D83937E84947D83937D83937C82927C82927B8191 +7B81917B81917A8193798092798092798092787F91787F91787F91777E90777E91777E91767D90 +767D90757C8F757C8F747B8E747B8E727A8D727A8D727A8D71798C70788B70788B6F778A6F778A +707C92636F87707C9696A4BFA6B5D4A1B0D1A2B2D4A2B2D4A2B0D3A2B0D3A1AFD2A0AED19FADD2 +9FADD29EACD19EACD19BAAD19BAAD19AA9D09AA9D099A8CF98A7CE98A7CE97A6CD93A6D192A5CD +92A4C893A2C994A1CD95A1CBCDD3DFCDD3E1CDD4E6CDD4E7CDD3E9CCD2E8CAD2E5CAD2E5CAD2E5 +CAD2E5CAD2E5C9D1E4C9D1E4C9D1E4C8D0E3C8D0E3C4CCE1C6CEE3C6CEE3C4CCE1C6CDE0C4CBDE +CAD1E49DA4B77E84947F85957F85958086968086968086967F85957E84947D83937D83937C8292 +7C82927B81917B81917A80907A8090798092798092798092787F91787F91787F91777E90777E90 +777E91767D90767D90757C8F757C8F747B8E747B8E737A8D727A8D727A8D71798C71798C70788B +6F778A6F778A6F778A6C788E626E8667738D919FBAA6B5D49FAECFA0B0D29EAED0A1AFD2A1AFD2 +A1AFD2A0AED19FADD29EACD19EACD19DABD09BAAD19AA9D09AA9D099A8CF98A7CE98A7CE97A6CD +97A6CD93A6D192A5CD92A4C893A2C994A1CD95A1CBCCD2E0CDD3E3CCD3E5CDD4E7CDD3E9CCD2E8 +CAD2E5C9D1E4CAD2E5CAD2E5C9D1E4C9D1E4C9D1E4C8D0E3C8D0E3C8D0E3C6CEE5C8D0E5C7CFE4 +C5CDE2C6CCE2C3CADDC7CEE1979EB17D83937E84947F85958086968086968086967F85957F8595 +7D83937C82927C82927B81917B81917A80907A80907A8090798092798092798092787F91787F91 +777E90777E90777E90767D90767D90757C8F757C8F747B8E747B8E737A8D737A8D727A8D71798C +71798C70788B70788B6F778A6F778A6F778A6E7A9069758D6A769092A0BBABBAD9A3B2D3A5B5D7 +A1B1D3A1AFD2A1AFD2A0AED19FADD09EACD19EACD19DABD09DABD09AA9D09AA9D099A8CF99A8CF +98A7CE97A6CD96A5CC96A5CC93A6D192A5CD92A4C893A2C994A1CD95A1CBCBD1DFCCD2E2CBD2E4 +CCD2E8CBD1E7CBD1E7C9D1E6C8D0E3C9D1E4C9D1E4C8D0E3C8D0E3C7CFE2C7CFE2C7CFE2C7CFE2 +C8D0E7C7CFE6C6CEE3C5CDE2C9CFE5C4CAE0C1C8DB8B92A57D83937E84947F85957F85957F8595 +7E84947D83937D83937C82927C82927C82927B81917A80907A8090797F8F797F8F798092798092 +787F91787F91787F91777E90777E90777E90767D90757C8F757C8F747B8E747B8E737A8D737A8D +737A8D71798C71798C71798C70788B70788B6F778A6F778A6E768968748A6B778F67738D8B99B4 +A4B3D29EADCEA3B3D59DADCFA1AFD2A0AED1A0AED19FADD09EACD19DABD09DABD09CAACF9AA9D0 +9AA9D099A8CF98A7CE97A6CD97A6CD96A5CC96A5CC92A5D091A4CC91A3C792A1C893A0CC94A0CA +CAD0DECBD1E1CAD1E3CBD1E7CAD0E6CAD0E6C8D0E5C7CFE2C8D0E3C7CFE2C7CFE2C7CFE2C6CEE1 +C6CEE1C6CEE1C6CEE1C4CCE3C2CAE1C0C8DFC2CADFC9CFE5C3C9DFBAC1D47F86997E84947E8494 +7E84947E84947E84947D83937B81917A80907C82927C82927B81917B81917A80907A8090797F8F +797F8F798092798092787F91787F91777E90777E90777E90777E90757C8F757C8F757C8F747B8E +747B8E737A8D737A8D72798C71798C71798C71798C70788B70788B6F778A6E76896E768969758B +707C9469758F8A98B3A2B1D09EADCEA5B5D79FAFD1A0AED1A0AED19FADD09FADD09EACD19DABD0 +9CAACF9CAACF9AA9D099A8CF99A8CF98A7CE97A6CD96A5CC96A5CC96A5CC91A4CF90A3CB90A2C6 +91A0C7929FCB939FC9C9D0E2C8D0E3C8D0E5C8D0E7C8D0E7C5D0E6C5D0E4C5D0E4C6D1E5C5D0E4 +C5D0E4C5D0E4C5D0E4C5D0E4C5D0E4C4CFE3BFCCDFC5D1E7BFCAE0C5CFE8BFCAE0C4CCE1BDC5D8 +7B84957D8496848B9D7D84967980927F86987B8294777E907C83957B82947B82947B82947B8294 +7A81937A8193798092798092787F92787F92787F92777E91767D90767D90757C8F757C8F737B8E +737B8E737B8E737B8E727A8D727A8D727A8D727A8D6F7B8B6F7B8B6E7A8A6E7A8A6D788A6C7789 +6C77896C77896C789065748B75839D97A6C3A9B8D7A1B1D29BABCD9EB0D49EAED09EAED29DADD1 +9DADD19CACD09BAAD19AA9D09AA9D098AAD297A9D196A8D095A7CF94A6CE94A6CE94A6CE94A6CE +8EA3D08EA4CD8DA3C88FA2CA8FA0CC929FCBC9D0E2C8D0E3C8D0E5C8D0E7C8D0E7C6D1E7C5D0E4 +C5D0E4C4CFE3C4CFE3C4CFE3C4CFE3C4CFE3C4CFE3C3CEE2C3CEE2C0CDE0C3CFE5BEC9DFC3CDE6 +BDC8DEC0C8DDBBC3D6818A9B777E907B82947E85977980927C8395808799798092787F917A8193 +7A81937A81937A8193798092798092798092787F91787F92787F92777E91777E91767D90767D90 +757C8F757C8F737B8E737B8E737B8E727A8D727A8D727A8D727A8D727A8D6F7B8B6F7B8B6E7A8A +6E7A8A6D788A6C77896C77896C778969758D7180978694AE9CABC8A6B5D4A2B2D39FAFD19FB1D5 +9EAED09EAED29DADD19CACD09CACD09BAAD19AA9D09AA9D098AAD297A9D196A8D095A7CF94A6CE +94A6CE94A6CE93A5CD8EA3D08EA4CD8DA3C88FA2CA8FA0CC929FCBC8CFE1C7CFE2C7CFE4C7CFE6 +C7CFE6C5D0E6C4CFE3C4CFE3C3CEE2C3CEE2C3CEE2C3CEE2C2CDE1C2CDE1C2CDE1C2CDE1C2CFE2 +C1CDE3BEC8E1C5CFE8BEC8E1BFC7DEBEC6D9949CAF7D8496777E90808799798092787F9182899B +798092777E907A8193798092798092798092787F91787F91787F91777E90787F92777E91777E91 +767D90767D90757C8F757C8F747B8E737B8E737B8E727A8D727A8D727A8D727A8D727A8D727A8D +6F7B8B6E7A8A6E7A8A6D788A6D788A6C77896C77896B768A6470887E8CA699A7C2A1B0CDA1B0CF +A1B1D3A2B2D69EB0D49EAED09DADD19DADD19CACD09BABCF9AA9D09AA9D09AA9D097A9D197A9D1 +96A8D095A7CF94A6CE93A5CD93A5CD93A5CD8EA3D08EA4CD8DA3C88FA2CA8FA0CC919ECAC6CDDF +C5CDE0C5CDE2C5CDE4C5CDE4C3CEE4C2CDE1C2CDE1C2CDE1C2CDE1C2CDE1C2CDE1C2CDE1C1CCE0 +C1CCE0C1CCE0C1CDE3BECAE0BDC7E0C5CFE8C0CAE3C1C9E0C3CBE0AAB2C58D94A6777E907F8698 +7A8193757C8E7F8698787F91798092798092798092798092787F91787F91787F91777E90777E90 +777E91777E91767D90767D90757C8F757C8F747B8E747B8E727A8D727A8D727A8D727A8D727A8D +727A8D71798C71798C6E7A8A6E7A8A6E798B6D788A6C77896C778B6B768A6B768A616D858290AA +A0AEC9A3B2CF9EADCE9EAED0A1B1D59DAFD39DADCF9DADD19CACD09CACD09BABCF9AA9D099A8CF +99A8CF97A9D196A8D095A7CF94A6CE93A5CD93A5CD93A5CD93A5CD8EA3D08DA3CC8DA3C88EA1C9 +8FA0CC919ECAC6CDDFC5CDE0C5CDE2C5CDE4C5CDE4C3CEE4C2CDE1C2CDE1C2CDE3C2CDE3C2CDE3 +C2CDE3C1CCE2C1CCE2C1CCE2C1CCE2BFCBE1BBC7DFBCC6DFC2CCE7BEC8E1BFC7DEC2CADFB7BFD2 +939AAC757C8E777E907B8294787F917A8193767D8F7C83957A8193798092798092798092787F91 +787F91787F91777E90777E91767D90767D90757C8F757C8F747B8E747B8E737A8D727A8D727A8D +727A8D727A8D727A8D71798C71798C71798C6E798B6E798B6D788A6D788A6C778B6C778B6B768A +6B768A636F89818FA99FADC8A4B3D29FAECF9CACCE9EAED29CAED49DADCF9CACD09CACD09BABCF +9AAACE99A8CF99A8CF99A8CF96A8D096A8D095A7CF94A6CE93A5CD92A4CC92A4CC92A4CC8DA2CF +8DA3CC8DA3C88EA1C98E9FCB919ECAC7CEE0C6CEE1C6CEE3C6CEE5C6CEE5C4CFE5C3CEE2C3CEE2 +C1CCE2C1CCE2C1CCE2C1CCE2C1CCE2C0CBE1C0CBE1C0CBE1C1CDE3BDC9E1BFC9E4C1CBE6BDC7E2 +BEC5DFC0C8DDBCC4D9959CAE7E859772798B7B82947D8496777E90787F917B8294798092798092 +798092787F91787F91787F91777E90777E90767D90767D90757C8F757C8F747B8E747B8E737A8D +737A8D727A8D727A8D727A8D71798C71798C71798C71798C71798C6E798B6E798B6D788A6D788C +6C778B6B768A6B768A6B768C66728C818FAA9EACC9A4B3D2A0AFD09DADD19EADD49CAED49CACCE +9CACD09BABCF9BABCF9AAACE99A8CF98A7CE98A7CE96A8D095A7CF94A6CE93A5CD92A4CC92A4CC +92A4CC92A4CC8DA2CF8DA3CC8CA2C78EA1C98E9FCB919ECAC6CDDFC5CDE0C5CDE2C5CDE4C5CDE4 +C2CDE3C2CDE1C1CCE0C0CBE1C0CBE1C0CBE1C0CBE1BFCAE0BFCAE0BFCAE0BFCAE0C0CCE4BDC9E1 +C1CBE6BFC9E4BDC7E2C0C7E1BEC6DDBFC7DCA8AFC19CA3B5798092787F917D8496757C8E7D8496 +787F91787F91787F91787F91787F91777E90777E90767D8F767D8F767D90757C8F757C8F747B8E +747B8E737A8D737A8D737A8D727A8D727A8D71798C71798C71798C71798C71798C71798C6E798B +6D788A6D788C6C778B6C778B6B768A6B768C6A758B67738D8492AD9FADCAA2B1D09EACCF9FAFD3 +9FAED59AACD29CACCE9BABCF9BABCF9AAACE99A9CD99A8CF98A7CE98A7CE95A7CF95A7CF94A6CE +93A5CD92A4CC91A3CB91A3CB91A3CB8DA2CF8DA3CC8CA2C78EA1C98E9FCB909DC9C3CADCC2CADD +C3CBE0C3CBE2C3CBE2C0CBE1C0CBDFBFCADEBFCAE0BFCAE0BFCAE0BEC9DFBEC9DFBEC9DFBEC9DF +BEC9DFBAC6DEB9C5DDBDC7E2BAC4DFB9C3DEBFC6E0BCC4DBBEC6DBC0C7D9BCC3D5848B9D767D8F +798092737A8C81889A767D8F777E90777E90777E90777E90767D8F767D8F767D8F757C8E757C8F +757C8F757C8F747B8E747B8E737A8D737A8D72798C727A8D727A8D71798C71798C71798C71798C +71798C71798C6D788A6D788A6D788C6C778B6C778B6B768C6B768C6A758B66718D8795B0A2B0CD +A0AFCE9BA9CC9FAFD3A0AFD697A9CF9CACCE9BABCF9BABCF9AAACE99A9CD98A7CE98A7CE97A6CD +95A7CF94A6CE93A5CD92A4CC92A4CC91A3CB91A3CB91A3CB8DA2CF8DA3CC8CA2C78DA0C88E9FCB +909DC9C5CCDEC3CBDEC2CAE1C2C9E3C1C8E4BFC9E4BFC9E2BFC9E2BECAE2BECAE2BFCBE3BECAE2 +BECAE2BDC9E1BDC9E1BCC8E0BBC7E1BBC7E1BBC7E1BBC7E1BBC7E1BAC6E0BAC6E0BAC6E0B4BFD5 +BCC7DD939BB070788D7A82957A8394747B8D767D8F777E91777E91777E91767D90767D90757C8F +757C8F757C8F747C8F747C8F747C8F737B8E737B8E737B8E727A8D727A8D6F7A8C6F7A8C6F7A8C +6E798B6E798B6D788A6D788A6D788A6E78916A758B6D788C6D788C6673866C788E6D7991616D85 +61708F8C9BBAA1B0D1A0AFD0A4B4D6A0B0D498A8CC9CACD099ABD398AAD298AAD297A9D196A8D0 +95A7CF95A7CF94A6CE94A6CE93A5CD93A5CD92A4CC91A3CB90A2CA90A2CA8FA1C98CA1D08BA1CA +8AA0C78C9FC78C9DC88F9CC6C3CADCC2CADDC1C9E0C1C8E2C0C7E3BEC8E3BEC8E1BEC8E1BDC9E1 +BDC9E1BDC9E1BDC9E1BDC9E1BCC8E0BCC8E0BBC7DFBAC6E0BAC6E0BAC6E0BAC6E0B9C5DFB9C5DF +B9C5DFB9C5DFB6C1D7BBC6DCA3AEC4747C917B8396777F92787F91787F91777E91777E91767D90 +767D90767D90757C8F757C8F757C8F737B8E737B8E737B8E727A8D727A8D727A8D71798C71798C +6E798B6E798B6E798B6E798B6D788A6D788A6D788A6C77896D77906A758B6A75896B768A687588 +69758B69758D64708A6978978E9DBC9FAECF9EACCFA2B2D4A0B0D499A9CD9DACD398AAD298AAD2 +97A9D197A9D196A8D095A7CF95A7CF94A6CE93A5CD93A5CD92A4CC92A4CC91A3CB90A2CA90A2CA +8FA1C98BA0CF8BA1CA8AA0C78C9FC78C9DC88F9CC6C2C9DBC1C9DCC0C8DFBFC6E0BFC6E2BDC7E2 +BDC7E0BDC7E0BCC8E0BCC8E0BCC8E0BCC8E0BCC8E0BBC7DFBAC6DEBAC6DEB9C5DFB9C5DFB8C4DE +B8C4DEB8C4DEB8C4DEB8C4DEB8C4DEB8C2DBB4BED7B0BBD1778298767E9371798C757D90778091 +767D90767D90767D90767D90757C8F757C8F757C8F747B8E727A8D727A8D727A8D71798C71798C +71798C70788B70788B6E798B6D788A6D788A6D788A6C77896C77896C77896B76886E798F6C778D +6974886A75896A778A66728866728A6F7B957B8AA995A4C59FAECF9BABCD9FAFD19EAED299A8CF +9AACD298AAD298AAD297A9D196A8D095A7CF95A7CF94A6CE94A6CE93A5CD93A5CD92A4CC91A3CB +90A2CA90A2CA8FA1C98FA1C98BA0CF8BA1CA8AA0C78B9EC68C9DC88F9CC6C1C8DAC0C8DBBFC7DE +BEC5DFBEC5E1BCC6E1BCC6DFBCC6DFBBC7DFBBC7DFBBC7DFBBC7DFBBC7DFBAC6DEB9C5DDB9C5DD +B8C4DEB8C4DEB8C4DEB8C4DEB7C3DDB7C3DDB7C3DDB7C3DDBAC6E0ADB7D0B3BDD68893A9768195 +767E9370788B767E91767D90767D90757C8F757C8F757C8F747B8E747B8E747B8E727A8D727A8D +727A8D71798C71798C70788B70788B70788B6D788A6D788A6C77896C77896B76886B76886B7688 +6B76886E798F707B916B768A6A75896B778D6470886C7892838EAA8F9EBF9EADCEA0B0D19BABCD +9CACD09AACD096A8CE97A9CF97A9D197A9D197A9D196A8D095A7CF94A6CE94A6CE93A5CD92A4CC +92A4CC92A4CC91A3CB90A2CA8FA1C98FA1C98EA0C88BA0CF8BA1CA8AA0C78B9EC68C9DC88F9CC6 +C1C8DAC0C8DBBFC7DEBEC5DFBEC5E1BCC6E1BCC6DFBCC6DFBBC7E1BBC7E1BBC7E1BBC7E1BBC7E1 +BAC6E0B9C5DFB9C5DFB8C4DEB8C4DEB7C3DDB7C3DDB7C3DDB7C3DDB7C3DDB7C3DDBCC8E2ADB9D3 +B3BFD7A9B3CC8E99AF8C97AB71798E757D92757C8F757C8F757C8F757C8F747B8E747B8E737A8D +737A8D727A8D727A8D727A8D71798C71798C71798C70788B70788B6C77896C77896C77896B7688 +6B76886A75876A75876A75876C778D707B916C778B6A758968748A64708A76819D98A3C19CACCD +A1B1D2A0B0D29BABCD99ABCF99ABD197A9CF97A9D197A9D197A9D196A8D095A7CF94A6CE94A6CE +93A5CD93A5CD92A4CC92A4CC91A3CB90A2CA8FA1C98FA1C98EA0C88EA0C88BA0CF8AA0C98AA0C7 +8B9EC68C9DC88E9BC5C0C7D9BFC7DABEC6DDBDC4DEBDC4E0BBC5E0BBC5DEBBC5DEBAC6E0BAC6E0 +BAC6E0BAC6E0BAC6E0B9C5DFB8C4DEB8C4DEB7C3DDB7C3DDB7C3DDB6C2DCB6C2DCB6C2DCB6C2DC +B6C2DCB8C3DFB0BBD7B3BFD9C0CCE4A9B3CCA4AFC57782986F7A8E757C8F757C8F747B8E747B8E +747B8E737A8D737A8D737A8D727A8D727A8D727A8D71798C71798C70788B70788B70788B6C7789 +6C77896C77896B76886B76886A75876A75876A75876A758B6C778D6B768A687389636F8767738D +818CAAA3AECE9FAFD09EAED09DADCF99ABCF99ABCF9AACD29AACD498ABD396A8D096A8D096A8D0 +95A7CF94A6CE93A5CD93A5CD92A4CC91A3CB91A3CB91A3CB90A2CA8FA1C98EA0C88EA0C88D9FC7 +8A9FCE8AA0C9899FC68B9EC68B9CC78E9BC5BFC6D8BDC5D8BDC5DCBCC3DDBCC3DFBAC4DFBAC4DD +BAC4DDB9C5DFB9C5DFB9C5DFB9C5DFB8C4DEB8C4DEB7C3DDB7C3DDB6C2DCB5C1DBB5C1DBB5C1DB +B5C1DBB5C1DBB5C1DBB5C1DBB2BDD9B4BFDBB0BBD7BDC9E3B6C0D9AEB8D1848FA56C778D747B8E +747B8E747B8E747B8E737A8D737A8D737A8D72798C71798C71798C71798C70788B70788B70788B +6F778A6F778A6C77896C77896C77896B76886B76886B76886A75876A75876A758B677286687387 +687389626E866E79958B96B4A4AED19FAFD19AAACC98ABCC9AACD098AAD099ABD199ACD498ABD3 +96A8D096A8D095A7CF94A6CE94A6CE93A5CD92A4CC92A4CC91A3CB91A3CB90A2CA8FA1C98FA1C9 +8EA0C88D9FC78D9FC78A9FCE8AA0C9899FC68A9DC58B9CC78E9BC5BEC5D7BCC4D7BCC4DBBBC2DC +BBC2DEB8C2DDB9C3DCB9C3DCB8C4DEB8C4DEB8C4DEB8C4DEB7C3DDB7C3DDB6C2DCB5C1DBB4C0DA +B4C0DAB4C0DAB4C0DAB4C0DAB4C0DAB3BFD9B3BFD9B0BEDBB8C3DFAEB9D5AFBBD5B6C2DAAEB8D1 +919CB26E798F747B8E747B8E747B8E737A8D737A8D737A8D72798C72798C70788B70788B70788B +6F778A6F778A6F778A6E76896E76896C77896C77896C77896B76886B76886B76886A75876A7587 +6C778D646F8367728669748A647088747F9B929DBDA2ACCF9FAFD198A8CA97A9CD9AACD097A9CF +95A9CE97AAD295A8D096A8D096A8D095A7CF94A6CE93A5CD93A5CD92A4CC92A4CC91A3CB91A3CB +90A2CA8FA1C98EA0C88EA0C88D9FC78D9FC78A9FCE8AA0C9899FC68A9DC58B9CC78E9BC5C1C3D8 +B9C3DCB5C5DFB6C6E0BAC4DDBAC1DBB7C0DDB6C3E5B6C4DFB6C4DFB5C3DEB5C3DEB5C3DEB4C2DD +B4C2DDB4C2DDB3C1DCB3C1DCB3C1DCB2C0DBB2C0DBB2C0DBB1BFDAB1BFDAB3BEDAB6C1DDABB6D4 +B3BEDCB1BCDAAFBAD6A5B1CB69758D757C8E737A8C687182737B8E6E798B6772847380916E7B8C +6E798D6E798D6D788C6D788C6D788C6C778B6C778B6C778B6C778B6C778B6C778B6B768A6B768A +6A75896A75896974886D788A6671856A768C69758F606E8B7885A597A6C79FADD09CABD49CABD4 +9BAAD39BAAD39AA9D29AA9D299A8D199A8D195A7CF94A6CE94A6CE93A5CD92A4CC92A4CC91A3CB +91A3CB8FA2CC8FA2CC8FA2CC8EA1CB8DA0CA8C9FC98C9FC98B9EC8899DCF899EC9899FC68B9EC8 +8C9DC98F9CC8C1C3D8B9C3DCB5C5DFB6C6E0BAC4DDBAC1DBB7C0DDB6C3E5B5C3DEB5C3DEB4C2DD +B4C2DDB4C2DDB3C1DCB3C1DCB3C1DCB2C0DBB2C0DBB2C0DBB1BFDAB1BFDAB1BFDAB0BED9B0BED9 +B3BEDAB5C0DCACB7D5B4BFDDB2BDDBAFBAD6AAB6D07A869E767E916F778A737B8E717C8E6C7789 +6C77896D7A8B6F7C8D6E798D6D788C6D788C6D788C6C778B6C778B6C778B6C778B6C778B6B768A +6B768A6B768A6B768A6A75896A75896A75896B768A69748868748C64708A6573908190AF9CAACD +9EACCF9BAAD39BAAD39AA9D29AA9D299A8D198A7D098A7D098A7D094A6CE94A6CE93A5CD92A4CC +91A3CB91A3CB90A2CA90A2CA8FA2CC8FA2CC8EA1CB8EA1CB8DA0CA8C9FC98C9FC98B9EC8899DCF +899EC9899FC68B9EC88C9DC98F9CC8C0C2D7B8C2DBB4C4DEB5C5DFB9C3DCB8BFD9B6BFDCB5C2E4 +B3C1DCB3C1DCB3C1DCB3C1DCB2C0DBB2C0DBB1BFDAB1BFDAB1BFDAB1BFDAB1BFDAB0BED9B0BED9 +B0BED9AFBDD8AFBDD8B4BFDBB4BFDDACB7D5B5C0E0B2BDDBAFBAD6B1BDD7929EB6767E93697186 +768195727D916D788C727D916774856E7B8C6D788C6D788C6D788C6C778B6C778B6C778B6B768A +6B768A6A75896A75896A75896A75896A75896A75896A75896A75896873876A758B6470885E6C87 +707E9B8F9EBF9FADD09AAACE9AA9D29AA9D299A8D199A8D198A7D097A6CF97A6CF97A6CF93A5CD +93A5CD92A4CC91A3CB90A2CA90A2CA8FA1C98FA1C98EA1CB8EA1CB8EA1CB8DA0CA8C9FC98C9FC9 +8B9EC88B9EC8899DCF899EC9899FC68B9EC88C9DC98F9CC8BEC0D5B6C0D9B2C2DCB3C3DDB7C1DA +B6BDD7B4BDDAB3C0E2B3C1DCB3C1DCB2C0DBB2C0DBB1BFDAB1BFDAB1BFDAB1BFDAB1BFDAB1BFDA +B0BED9B0BED9AFBDD8AFBDD8AFBDD8AFBDD8B2C0DBB0BEDBABB8D8B2BFDFAEBBDBACBAD7B2C0DA +A4B2CC7B869C6772886C778B727D91727D91717C906774876B788B6D788C6D788C6C778B6C778B +6B768A6B768A6B768A6B768A6974886974886A75896A75896A75896A75896A75896A7589657086 +657187616D8765738E7F8EAD98A6C99CACD098A8CC99A8D199A8D199A8D198A7D097A6CF97A6CF +96A5CE96A5CE93A5CD92A4CC92A4CC91A3CB90A2CA8FA1C98FA1C98FA1C98DA0CA8DA0CA8DA0CA +8DA0CA8C9FC98C9FC98B9EC88B9EC8899DCF899EC9899FC68B9EC88C9DC98F9CC8BEC0D5B6C0D9 +B1C1DBB3C3DDB6C0D9B6BDD7B4BDDAB2BFE1B2C0DBB2C0DBB2C0DBB2C0DBB1BFDAB1BFDAB0BED9 +B0BED9B1BFDAB0BED9B0BED9B0BED9AFBDD8AFBDD8AFBDD8AFBDD8B1BFDCAFBDDAACB9D9AFBCDC +ACB9D9AAB8D5B0BED9AEBCD6919DB577839B636F87707C92727E946875886E798D6C778B6C778B +6C778B6C778B6B768A6B768A6B768A6A75896A7589697488697488697488697488697488697488 +6A75896A7589647088636F8765738D7987A492A1C29CACCE9AA9D099A8CF99A8D199A8D199A8D1 +98A7D097A6CF97A6CF96A5CE96A5CE93A5CD93A5CD92A4CC91A3CB90A2CA90A2CA8FA1C98FA1C9 +8DA0CA8C9FC98C9FC98C9FC98C9FC98B9EC88B9EC88B9EC8899DCF899EC9899FC68B9EC88C9DC9 +8F9CC8BEC0D5B6C0D9B2C2DCB3C3DDB7C1DAB7BED8B4BDDAB3C0E2B2C0DBB2C0DBB1BFDAB1BFDA +B0BED9B0BED9B0BED9B0BED9B0BED9B0BED9B0BED9AFBDD8AFBDD8AFBDD8AEBCD7AEBCD7AFBDDA +AEBBDBADBADAACB9DBABB8D8A9B7D4ABB9D4AFBDD7A9B7D1909EB86F7B93707C946D798F647086 +737E926D788C6C778B6B768A6B768A6B768A6A75896A75896A75896A7589697488697488697488 +69748869748869748869748869748864708865718B74829D8E9DBC9EADCE9DADD19AA9D098AAD2 +99A8D199A8D198A7D098A7D097A6CF96A5CE96A5CE96A5CE93A5CD92A4CC92A4CC91A3CB90A2CA +8FA1C98FA1C98FA1C98C9FC98C9FC98B9EC88B9EC88B9EC88B9EC88B9EC88B9EC8899DCF899EC9 +899FC68B9EC88C9DC98F9CC8BDBFD4B5BFD8B0C0DAB2C2DCB5BFD8B5BCD6B3BCD9B2BFE1B0BED9 +B0BED9B0BED9AFBDD8AFBDD8AFBDD8AEBCD7AEBCD7AFBDD8AFBDD8AFBDD8AEBCD7AEBCD7ADBBD6 +ADBBD6ADBBD6ACBAD7ADBADAADBADCA9B6D8AAB7D9ABB8D8A8B6D1ABB9D4AFBDD8A4B2CD8D9BB5 +77839B67738B69758B717C906B768A6B768A6B768A6B768A6A75896A75896A7589697488697488 +697488697488697488687387687387687387687387677286616D8767758F8593B09DACCB9EACCF +9AAACE99ABD396A8D098A7D097A6CF97A6CF96A5CE96A5CE95A4CD95A4CD95A4CD92A4CC91A3CB +91A3CB90A2CA8FA1C98FA1C98EA0C88EA0C88B9EC88B9EC88B9EC88B9EC88B9EC88B9EC88B9EC8 +8B9EC8899DCF899EC9899FC68B9EC88C9DC98F9CC8BABCD1B2BCD5AEBED8AFBFD9B3BDD6B3BAD4 +B1BAD7AFBCDEAFBDD8AFBDD8AFBDD8AEBCD7AEBCD7AEBCD7ADBBD6ADBBD6AEBCD7AEBCD7AEBCD7 +ADBBD6ADBBD6ACBAD5ACBAD5ACBAD5A9B8D5ABBAD9ACBBDCA7B6D7AAB9DAACBBDAA5B4D1A7B7D1 +A6B5D2A9B9D3A8B6D17D8BA5657189717D936D788C6671856B768A6B768A6B768A6A75896A7589 +6974886974886974886A75896974886974886873876873876772866772866772865B69836B7994 +8F9DBAA2B1D098A8CA97A6CD9BADD592A3CE97A6CF96A5CE96A5CE95A4CD95A4CD94A3CC94A3CC +94A3CC91A3CB91A3CB90A2CA8FA1C98EA0C88EA0C88D9FC78D9FC78B9EC88B9EC88B9EC88B9EC8 +8B9EC88B9EC88B9EC88B9EC8899DCF899EC9899FC68B9EC88C9DC98F9CC8B3BED4B2BDD9B0BDDD +AFBEDBAFBFD8AEBED5AFBDD8B1BBDEAFBDDAAFBDDAAFBDDAAEBCD9AEBCD9ADBBD8ADBBD8ADBBD8 +ACBBD8ACBBD8ACBBD8ACBBD8ACBBD8ABBAD7ABBAD7ABBAD7A9B8D7A9B8D7A9B8D7A9B8D7A8B7D6 +A8B7D6A8B7D6A8B7D6A5B5D7AAB9DAA5B3D07C86A16D788E6772866974886B788B6B768C6B768C +6A758B6A758B69748A69748A69748A69748A687387687387677286677286677286677286677286 +67728662708B616F8C96A5C499A8C997A7CB97A9D197A8D397A8D494A6CE94A6CE94A6CE93A5CD +92A4CC92A4CC91A3CB91A3CB8FA2CC8EA1CB8EA1CB8DA0CA8DA0CA8DA0CA8DA0CA8DA0CA8B9EC9 +8B9EC98B9EC98B9EC98B9EC98B9EC98B9EC98B9EC9899DCF899EC9899FC68B9EC88C9DC98F9CC8 +B2BDD3B1BCD8AFBCDCAEBDDAAEBED7ADBDD4AEBCD7B0BADDAFBDDAAFBDDAAEBCD9AEBCD9ADBBD8 +ADBBD8ADBBD8ADBBD8ACBBD8ABBAD7ABBAD7ABBAD7ABBAD7ABBAD7ABBAD7ABBAD7A9B8D7A9B8D7 +A9B8D7A8B7D6A8B7D6A8B7D6A8B7D6A8B7D69FAFD1A5B4D5A1AFCC78829D6C778D6A75896B768A +6B788B6A758B6A758B6A758B6A758B69748A69748A69748A687389677286677286677286677286 +677286677286667185667185616F8A606E8993A2C19AA9CA98A8CC97A9D194A5D090A1CC94A6CE +94A6CE93A5CD93A5CD92A4CC92A4CC91A3CB91A3CB8FA2CC8EA1CB8EA1CB8DA0CA8C9FC98C9FC9 +8DA0CA8DA0CA8B9EC98B9EC98B9EC98B9EC98B9EC98B9EC98B9EC98B9EC9899DCF899EC9899FC6 +8B9EC88C9DC98F9CC8B1BCD2B0BBD7AEBBDBADBCDBADBDD6ACBCD3ADBBD8AFB9DCAEBCD9AEBCD9 +AEBCD9ADBBD8ADBBD8ACBAD7ACBAD7ACBAD7AAB9D8AAB9D8AAB9D8AAB9D8AAB9D8AAB9D8A9B8D7 +A9B8D7A8B7D6A8B7D6A8B7D6A8B7D6A8B7D6A7B6D5A7B6D5A7B6D5A1B1D3A8B7D6A3B1CC78829D +6B768C6B768C6B768C68748A6A758B6A758B6A758B69748A69748A687389687389687389677288 +67728867728867728866718766718766718766718764728D62708B8E9DBA9BAACB98A8CC98AAD0 +95A6D191A2CD94A6CE93A5CD93A5CD92A4CC92A4CC91A3CB91A3CB91A3CB8EA1CB8EA1CB8DA0CA +8C9FC98C9FC98C9FC98C9FC98C9FC98B9EC98B9EC98B9EC98B9EC98B9EC98B9EC98B9EC98B9EC9 +899DCF899EC9899FC68B9EC88C9DC98F9CC8B1BBD4B0BBD7ADBADCACBBDAACBCD5ACBCD5ADBBD8 +AFB9DDADBBD8ADBBD8ADBBD8ACBAD7ACBAD7ACBAD7ABB9D6ABB9D6A9B8D7A9B8D7A9B8D7A9B8D7 +A9B8D7A8B7D6A8B7D6A8B7D6A7B6D5A7B6D5A7B6D5A7B6D5A7B6D5A7B6D5A6B5D4A6B5D4A1B1D2 +ABBAD9A6B4CF78829B69748A69748A6A758B6773896A758B69748A69748A69748A687389687389 +68738967728867728866718766718766718766718766718766718766718764728C63718C8897B4 +99A8C995A5C796A8CE98AAD296A7D293A5CD93A5CD93A5CD92A4CC91A3CB91A3CB90A2CA90A2CA +8EA1CB8DA0CA8DA0CA8C9FC98C9FC98B9EC88C9FC98C9FC98B9EC98B9EC98B9EC98B9EC98B9EC9 +8B9EC98B9EC98B9EC9899DCF899EC9899FC68B9EC88C9DC98F9CC8B1BBD4B0BBD9ADBADCACBBDA +ACBCD6ACBCD5ADBBD8AFB9DDADBADAACB9D9ACB9D9ACB9D9ABB8D8ABB8D8ABB8D8AAB7D7A8B7D6 +A8B7D6A8B7D6A8B7D6A8B7D6A8B7D6A7B6D5A7B6D5A7B6D5A7B6D5A6B5D4A6B5D4A6B5D4A6B5D4 +A6B5D4A6B5D49EAFCDA8B7D4A3B1CC7680996772886772886A748D6A768E69748A69748A69748A +687389687389677288677288677288667187667187667187667187657086657086657086657086 +606E8863718C8493B09BAAC992A2C492A4CA95A7CF93A4CF93A5CD92A4CC92A4CC91A3CB91A3CB +90A2CA90A2CA90A2CA8DA0CA8DA0CA8C9FC98B9EC88B9EC88B9EC88B9EC88B9EC88B9EC98B9EC9 +8B9EC98B9EC98B9EC98B9EC98B9EC98B9EC9899DCF899EC9899FC68B9EC88C9DC98F9CC8B0BAD3 +AFBAD8ADBADCACBBDCACBCD6ABBBD4ACB9D9AEB8DCACB9D9ACB9D9ABB8D8ABB8D8AAB7D7AAB7D7 +AAB7D7AAB7D7A8B7D8A8B7D8A8B7D8A8B7D8A7B6D7A7B6D7A7B6D7A7B6D7A6B5D4A6B5D4A6B5D4 +A5B4D3A5B4D3A5B4D3A5B4D3A5B4D3A6B7D5A8B7D49FADC8757F9868728B66708967718A68748C +69748A687389687389687389677288677288677288667187656F88656F88656F88656F88656F88 +656F88656F88646E875F6D8764728C8090AA9FAECD95A5C794A6CA93A5CD8EA0C892A4CC92A4CC +91A3CB91A3CB90A2CA90A2CA8FA1C98FA1C98DA0CA8C9FC98C9FC98B9EC88B9EC88A9DC78B9EC8 +8B9EC88B9EC98B9EC98B9EC98B9EC98B9EC98B9EC98B9EC98B9EC9899DCF899EC9899FC68B9EC8 +8C9DC98F9CC8AFB9D4AEB9D7ACB9DCABBADBAABAD4AABAD4ABB8D8ADB6DDABB8D8ABB8D8ABB8D8 +AAB7D7AAB7D7AAB7D7A9B6D6A9B6D6A8B7D8A8B7D8A8B7D8A8B7D8A7B6D7A7B6D7A7B6D7A7B6D7 +A5B4D3A5B4D3A5B4D3A5B4D3A5B4D3A4B3D2A4B3D2A4B3D2A7B8D69EADCA919FB96D779069738C +67718A67718A67738D687389687389687389677288677288667187667187667187656F88656F88 +656F88656F88646E87646E87646E87646E875F6E85606E8873839D98A7C692A2C395A7CB96A8CE +8EA0C892A4CC92A4CC91A3CB90A2CA90A2CA8FA1C98FA1C98FA1C98C9FC98C9FC98B9EC88B9EC8 +8A9DC78A9DC78A9DC78A9DC78B9EC98B9EC98B9EC98B9EC98B9EC98B9EC98B9EC98B9EC9899DCF +899EC9899FC68B9EC88C9DC98F9CC8AEB8D3ADB8D6ABB8DBAAB9DAA9B8D5A9B9D3AAB7D7ACB5DC +ABB8D8ABB8D8AAB7D7AAB7D7AAB7D7A9B6D6A9B6D6A9B6D6A8B7D8A8B7D8A8B7D8A8B7D8A7B6D7 +A7B6D7A7B6D7A7B6D7A5B4D3A5B4D3A5B4D3A5B4D3A4B3D2A4B3D2A4B3D2A4B3D298A9C58A9AB4 +7B89A3616B8467718A6A748D6A748D6B7791687389687389677288677288677288667187667187 +667187656F88656F88656F88646E87646E87646E87646E87646E875D6C8358668062728C8A99B8 +8898B993A5C997A9CF90A2CA92A4CC91A3CB91A3CB90A2CA90A2CA8FA1C98FA1C98EA0C88C9FC9 +8C9FC98B9EC88A9DC78A9DC78A9DC78A9DC78A9DC78B9EC98B9EC98B9EC98B9EC98B9EC98B9EC9 +8B9EC98B9EC9899DCF899EC9899FC68B9EC88C9DC98F9CC8AFB9D4ACB7D7A9B5DBA8B6DBA7B8D6 +A9B9D3A8B7D4A8B5D7A9B8D9A9B8D9A8B7D8A6B5D6A7B6D7AAB9DAABBADBA8B7D8A5B4D1A6B5D2 +A5B4D1A2B1CEA1B0CDA3B2CFA4B3D0A4B3D0A9B5DDACB8DEA8B4DAA0ADD0A0ADCFA5B2D2A1AFCC +96A4C17F89A2717B9467718A69738C6D77906B758E67718A67718A67718A67718A667089667089 +667089656F88656F88656F8865718B64708A64708A64708A636F89636F89636F89636F89617087 +617087616F8964728D6B7A977A89A88C9BBA99A8C98EA0C88FA1C78EA0C68D9FC590A2CA92A3CE +8FA0CC8A9BC98A9ACB8A9ACB8A9ACB8B9BCC8D9DCE8D9DCE8C9CCD8C9CCD8A9DC78A9DC78B9EC8 +8B9EC88B9EC88B9EC88A9DC78A9DC7889CCE8A9FCC8AA0C98A9DC78B9CC88F9CC8AEB8D3ABB6D6 +A8B4DAA7B5DAA6B7D5A8B8D2A7B6D3A7B4D6A8B7D8A9B8D9A8B7D8A6B5D6A5B4D5A6B5D6A5B4D5 +A2B1D2A9B8D7ABBAD9ABBAD9A8B7D6A7B6D5A7B6D5A6B5D4A4B3D29DAACDA0ADD0A2AFD1A3B0D2 +A4B1D19CAAC78694B16F7D98707A9368728B646E8767718A69738C667089646E8766708967718A +67718A667089667089656F88656F88656F88656F8864708A64708A636F89636F89626E88626E88 +626E88626E8864738A606F865B69835765805968856473907584A38190AF8A9CC291A3C994A6CA +90A2C68B9DC38B9DC58C9DC98D9ECC91A2CE90A1CD8E9FCB8C9DC98C9DC98B9CC88B9CC88B9CC8 +8B9EC88B9EC88B9EC88B9EC88B9EC88B9EC88B9EC88B9EC8889CCE8A9FCC8AA0C98B9EC88C9DC9 +909DC9ADB7D2AAB5D5A7B3D9A6B4D9A5B6D4A6B6D0A6B5D2A6B3D5A3B2D3A6B5D6A8B7D8A6B5D6 +A6B5D6A6B5D6A6B5D6A4B3D49FAECDA1B0CFA2B1D0A2B1D0A3B2D1A5B4D3A6B5D4A4B3D2ACB9D9 +A9B6D6A3B0D097A5C28593AE72809B62708A58668067718A656F8867718A6A748D69738C646E87 +646E8768728B667089667089667089656F88656F88656F88646E87646E87636F89636F89626E88 +626E88626E88616D87616D87616D875967815C6A845F6D87606E895D6C895C6B885C6B8A5C6B8A +6E80A47B8DB1899BBF8FA2C38FA1C58D9FC58B9CC7899AC6879AC2889BC3899CC48B9EC68A9DC5 +899CC4879AC28699C18B9EC88B9EC88B9EC88A9DC78A9DC78B9EC88B9EC88B9EC8889CCE8A9FCC +8AA0C98A9DC78C9DC9919ECAACB6D1AAB5D5A6B2D8A5B3D8A5B6D4A6B6D0A5B4D1A6B3D5A2B1D2 +A6B5D6A7B6D7A5B4D5A5B4D5A6B5D6A7B6D7A6B5D6A8B7D8A8B7D8A7B6D7A4B3D4A4B3D4A5B4D5 +A4B3D4A2B1D2A2ADC996A1BD8691AD77839D68748E606C846571896E7A9269738C69738C6A748D +6C768F69738C656F88646E8767718A667089667089656F88656F88656F88646E87646E87646E87 +636F89626E88626E88626E88616D87616D87616D87606C86606E88606E885E6C875C6A85586882 +5867845A69865C6B8858688A6070926D7D9E7C8CAD8A9ABC91A1C591A0C98E9DC88B9EC98B9EC9 +8B9EC98B9EC98A9DC88B9EC98C9FCA8DA0CB8C9FC98B9EC88A9DC78A9DC78A9DC78A9DC78B9EC8 +8C9FC9889CCE8A9FCC8AA0C98A9DC78B9CC8909DC9ACB6D1AAB5D5A6B2D8A5B3D8A5B6D4A6B6D0 +A5B4D1A6B3D5A5B4D5A7B6D7A6B5D6A3B2D3A2B1D2A3B2D3A3B2D3A2B1D2A5B2D2A6B3D3A7B4D4 +A6B3D3A5B2D2A4B1D19FACCC9AA7C7828EA8707C94626E86626E8667738B69758D6A768C6C788E +6B758E69738C68728B68728B67718A656F88646E87656F88656F88656F88656F88646E87646E87 +646E87636D86636D86636F89636F89626E88626E88626E88616D87616D87616D875E6C875E6C87 +5D6B865B69845969835968855B6A875C6B885B6A8B5867865867865F6E8D6D7C9D7D8BAE8A98BD +919FC68FA1D18EA0D08C9ECE889ACA8698C88799C98A9CCC8D9FCF8C9DC88C9DC88C9DC88B9CC7 +8B9CC78C9DC88C9DC88C9DC8899DCF8A9FCC8AA0C9899CC68A9BC78F9CC8ACB6D1A9B4D4A6B2D8 +A5B3D8A4B5D3A5B5CFA5B4D1A5B2D4A4B3D4A5B4D5A4B3D4A3B2D3A4B3D4A7B6D7A6B5D6A3B2D3 +A1AFCCA1AFCC9FADCA9BA9C695A3C08D9BB88290AD7886A36F7B9367738B636F8767738B6A768E +66728A626E86606C846A748D67718A656F88656F8866708967718A67718A667089656F88656F88 +646E87646E87646E87636D86636D86636D86636F89626E88626E88626E88616D87616D87616D87 +606C865866815B69845F6D88616F8A60708A5D6D875969835666805B6A875A6986586784566582 +5665825C6B8C6A789B7785AA798AB88091BF899AC88FA0CE90A1CF8E9FCD8B9CCA8A9BC98B9CC7 +8C9DC88C9DC88C9DC88C9DC88C9DC88C9DC88B9CC7899DCF8BA0CD8AA0C9899CC68A9BC78F9CC8 +ABB5D0A8B3D3A5B1D7A3B1D6A3B4D2A4B4CEA4B3D0A4B1D3A2B1D2A3B2D3A2B1D2A3B2D3A5B4D5 +A6B5D6A1B0D19BAACBA2B0CB9DABC692A0BB8593AE7A88A3707E9964728D5B6984636D86667089 +6A748D6A748D667089656F8868728B6C768F68728B67718A66708966708967718A68728B68728B +67718A646E87646E87646E87646E87636D86636D86626C85626C85626E88616D87616D87616D87 +606C86606C86606C86606C8663718E606E8B5B69845866815767815969835D6D875F6F89596782 +5967825B69845A688355637E525F7F5562845C698C6170996C7BA47A89B28695BE8C9BC48E9DC6 +8F9EC78F9EC78A9BC68B9CC78C9DC88D9EC98D9EC98C9DC88B9CC78A9BC6899DCF8A9FCC8AA0C9 +8A9DC78B9CC8919ECAA9B3CEA7B2D2A4B0D6A2B0D5A2B3D1A3B3CDA3B2CFA3B0D2A5B4D5A4B3D4 +A2B1D2A0AFD0A0AFD09BAACB909FC08695B67984A0727D9967728E5F6A86606B8765708C697490 +69749068728B68728B667089656F8866708967718A66708B646E89646E8766708967718A667089 +646E87646E87646E87636D86646E87646E87646E87636D86636D86636D86626C85626C85616D87 +616D87606C86606C865F6B855F6B855F6B855F6B855A68855B69865C6A875D6B865D6D875B6B85 +5868825666805F6D8859678256647E5967815B69845A68855966865B688A526182536283546384 +5766875F6E8F6D7C9D7D8CAD8998B9899AC58B9CC78D9EC98E9FCA8E9FCA8D9EC98B9CC7899AC5 +889CCE8A9FCC8AA0C98A9DC78D9ECA94A1CDA6B3D5A3B2D3A0B3D49FB3D4A1B4D4A3B4D2A5B3CE +A8B2CDACB7D3A0ABC7929DB98792AE7C87A3727D996E79956E799568728B68728B68728B68728B +69738C69738C69738C69738C67718C67718C67718C67718C66708B66708B66708B66708B65718B +65718B64708A64708A636F89636F89636F89636F89636C89636C89636C89626B88626B88626B88 +616A87616A87606B87606B87606B875F6A865F6A865F6A865F6A865F6A865B69865B69865B6986 +5B69865B69865A68855A68855A68855A68855A68855A68855A68855A68855A68855A68855A6885 +5966885966885A67895A67895B688A5C698B5C698B5D6A8C6776977382A37987AA7D8BB08896BD +909DC78F9CC68F9CC88C9ECC899BC98B9CC894A3CE8996C094A0C8A9B6D8A1B0D199ACCD9AAECF +9FB2D2A2B3D1A5B0CCA5AFCA838EAA76819D6A759167728E68738F66718D616C885F6A86667089 +66708966708966708966708966708966708966708967718A67718A67718A667089667089667089 +667089667089647088647088647088647088636F87636F87636F87626E86636D88636D88636D88 +626C87626C87616B86616B86616B86606B87606B875F6A865F6A865F6A865F6A865F6A865F6A86 +5B69865B69865B69865B69865A68855A68855A68855A68855A68855A68855A68855A68855A6885 +5A68855A68855A68855764845764845764845865855865855865855865855865855261805A6988 +5C6B8C5E6D8E6A789B7987AC8795BC94A2C98B9EC98C9FCA8B9CC892A0CD8A97C1939FC7A6B0D3 +A4B3D4A1B1D39DB0D1A1B4D4A4B3D296A1BD828CA76E7A9266728A616D85626E8667738B69758D +68748C68748C67718A67718A67718A67718A667089667089667089667089667187667187667187 +667187667187667187657086657086647086647086647086636F85636F85626E84626E84626E84 +636D88626C87626C87626C87616B86616B86616B86606A855F6A865F6A865F6A865F6A865F6A86 +5E69855E69855E69855B69865B69865B69865B69865A68855A68855A68855A68855A68855A6885 +5A68855A68855A68855A68855A68855A68855B69865A68855A6885596784596784586683586683 +57658255657F57678152617E4F5E7B5362815D6C8D6F7E9F8493B4899CC690A3CE8B9CC88F9DCA +8C99C5939FC79EA8CBA8B5D7A6B6D89AADCE9CAFCFA1B0CF8893AF646B8766728868748A6A768C +68748A64708664708668748A6D798F67718A67718A67718A67718A667089667089667089656F88 +667187667187667187667187657086657086657086657086647086636F85636F85636F85626E84 +626E84626E84616D83626C85626C85626C85616B84616B84606A83606A83606A835F6A865F6A86 +5E69855E69855E69855E69855E69855E69855B69865B69865A68855A68855A68855A68855A6885 +5A68855A68855A68855A68855A68855A68855A68855A68855A68855D6B865C6A855C6A855B6984 +5B69845A68835A68835967825E6E875F6F885A6A8357678155657F52617E5A69866B7A978194BC +8FA2CC8A9BC78D9BC88E9BC794A0C8A3ADD0A3B0D29EAED097AACB98A8C992A1C07D88A4666D89 +65708669748A6B768C687389626D83606B81636E84677288656F88656F88646E87646E87646E87 +636D86636D86636D86657086657086657086657086657086657086646F85646F85646F85646F85 +646F85636E84636E84626D83626D83626D83626C87616B86616B86616B86606A85606A85606A85 +5F69845E69855E69855E69855E69855D68845D68845D68845D68845A67875A67875A67875A6787 +5A67875A67875966865966865A67875A67875A67875A67875A67875A67875A67875A6787596782 +59678259678259678259678259678259678259678257657F5967815967815C6A855F6D88596782 +576580606E897589AC8A9EC38A9BC68F9DCA8E9BC895A1CBAAB2D69BA8CA9AA8CBA5B5D79BABCC +7D8AAA69728F69708C6A758B69748A6772886671876873896B768C687389646F85656F88656F88 +656F88656F88646E87646E87646E87646E87656F88656F88656F88646E87646E87646E87646E87 +646E87646E87636D86636D86636D86626C85626C85626C85616B84616A87616A87616A87606986 +6069865F68855F68855F68855E69855E69855D68845D68845D68845D68845D68845D68845A6787 +5A67875A67875A67875966865966865966865966865A67875A67875A67875A67875A67875A6787 +5A67875A6787586683586683586683586683596784596784596784596784576582596784586683 +5A68855E6C895A6885556380586683677B9C7F93B68A9BC692A0CD8C99C694A0CAA6AED29BA5C8 +9EACCFAABADC97A7C86E7B9B5C6582666B88667089656F88636D86626C856670896A748D68728B +626C85667089667089667089667089667089667089667089667089646D8A646D8A646D8A646D8A +646D8A646D8A636C89636C89636C89636C89636C89626B88626B88616A87616A87616A87616A89 +6069886069886069885F68875F68875F68875F68875D68845D68845D68845D68845D68845C6783 +5C67835C67835A67875A67875A67875A67875966865966865966865966865A67875A67875A6787 +5A67875A67875A67875A67875A67875966865966865A67875A67875A67875A67875A67875B6888 +5D6A8C606D8F5C698B5764845966865865855461815562825A6F8C7488AB899AC595A3D28996C3 +919DC79FA7CB9DA7CA9EACCF9BABCD8494B5697696626B886C718E636D8867718C69738E656F8A +626C87646E8966708B656F8A636D86646E87646E87646E87656F88656F88656F88656F88646D8A +646D8A646D8A646D8A646D8A636C89636C89636C89636C89636C89626B88626B88626B88616A87 +616A87616A8760698A60698A60698A60698A5F68895F68895E67885E67885D68845D68845D6884 +5D68845C67835C67835C67835C67835A67875A67875A6787596686596686596686596686596686 +5A67875A67875A67875A67875A67875A67875A67875A6787596688596688596688596688596688 +5966885966885966885862865F698D5C668A5660845A64875E688B5E688B5F698C5368856D81A2 +899BC397A5D48591C18E9AC4A1ADC59FADCAA1B0D199A8C78898AF617181657285667187656F88 +656F88646E87646E87646E87646E87646E87646E87646E89646E89646E89646E89646E89646E89 +646E89646E89636E84636E84636E84626D83626D83626D83626D83626D83616C82616C82616C82 +616C82616C82616C82616C82606B81616C82616C82606B81606B81606B815F6A805F6A805F6A80 +58687F58687F58687F58687F58687F58687F58687F58687F57687C57687C57687C57687C57687C +57687C57687C57687C57687C57687C57687C57687C57687C57687C57687C57687C57687C57687C +57687C57687C57687C57687C57687C57687C57677E57677E57677E57677E57677E57677E57677E +57677E546873677C91889BBC8B9FC2869AB58FA1B59CAAC49CA9C99EACCF95A4C58292AB5D6C7F +616E81636D86657189657189657189647088647088647088647088647088616D87616D87616D87 +616D87616D87616D87616D87616D87636F87636F87626E86626E86626E86626E86626E86626E86 +616D85616D85616D85616D85616D85606C84606C84606C84606C84606C84606C84606C845F6B83 +5F6B835E6A825E6A825B6B845B6B845B6B845B6B845B6B845B6B845B6B845B6B845C6C835C6C83 +5C6C835C6C835C6C835C6C835C6C835C6C835C6C835C6C835C6C835C6C835C6C835C6C835C6C83 +5C6C835C6C835C6C835C6C835C6C835C6C835C6C835C6C835C6C835C6C855C6C855C6C855C6C85 +5C6C855C6C855C6C855C6C8556687C6B7C9A8A9BC68FA0CC8A9CC093A4C09CAAC59AA9CA9CACD0 +94A4C67B8CA65A6B7F626E86636F89606C84606C84606C84606C845F6B835F6B835F6B835F6B83 +616D87616D87616D87616D87616D87616D87616D87616D875E69855D68845D68845D68845D6884 +5D68845D68845D68845C67835C67835B66825B66825B66825B66825B66825B66825B66825B6682 +5A65815A65815A6581596480596480596480556380556380556380556380556380556380556380 +556380576580576580576580576580576580576580576580576580576580576580576580576580 +576580576580576580576580576580576580576580576580576580576580576580576580576580 +57658057658057658057658057658057658057658054638067759C8896C78C9CCF8B99C693A1C6 +9CAAC79AA9CA9AA9D094A4C67687A15B6B82647088646F8B67738B67738B67738B67738B67738B +66728A66728A66728A616D85616D85616D85616D85616D85616D85616D85616D8565708C65708C +646F8B646F8B646F8B646F8B646F8B646F8B636E8A626D89626D89626D89626D89626D89626D89 +616C88626D89626D89616C88616C88616C88606B87606B87606B875E69895E69895E69895E6989 +5E69895E69895E69895E69895E69855E69855E69855E69855E69855E69855E69855E69855E6985 +5E69855E69855E69855E69855E69855E69855E69855E69855E69855E69855E69855E69855E6985 +5E69855E69855E69875E69875E69875E69875E69875E69875E69875E698752607D627097838FC1 +8B98CC8A97C4919EC19BA9C499A6C698A6CB94A3C471819A5D6C81657187646E875F6C7F5F6C7F +5F6C7F5F6C7F5F6C7F5F6C7F5E6B7E5E6B7E616D83616D83616D83616D83616D83616D83616D83 +616D835D69835D69835D69835D69835C68825C68825C68825C68825B67815B67815B67815B6781 +5B67815A66805A66805A66805B66825A65815A65815A658159648059648059648058637F5C6584 +5C65845C65845C65845C65845C65845C65845C65845B64815B64815B64815B64815B64815B6481 +5B64815B64815B64815B64815B64815B64815B64815B64815B64815B64815B64815B64815B6481 +5B64815B64815B64815B64815B64815B64815B64815B64815B64815B64815B64815B64815B6481 +59657B6873938692BC8E9BC78F9CBF97A2BEA0ABC19BA6C297A4C498A6C37281966471816D7588 +6870856E77886E77886D76876D76876D76876D76876D76876D7687687083687083687083687083 +6870836870836870836870836C748B6C748B6C748B6B738A6B738A6B738A6B738A6B738A6B738A +6B738A6B738A6A72896A72896A72896A72896A72896A718B6A718B6A718B69708A69708A686F89 +686F89686F896A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B +6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B +6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A718B6A72896A72896A72896A72896A7289 +6A72896A72896A7289616D796C788E8993B6919EC1949FBB9BA6BA + +end +%%PageTrailer +%%Trailer +%%EOF diff --git a/public/lib/templates/template7/inputs/picture.jpg b/public/lib/templates/template7/inputs/picture.jpg new file mode 100644 index 00000000..6b54f4d0 Binary files /dev/null and b/public/lib/templates/template7/inputs/picture.jpg differ diff --git a/public/lib/templates/template7/inputs/publications.bib b/public/lib/templates/template7/inputs/publications.bib new file mode 100644 index 00000000..2b970967 --- /dev/null +++ b/public/lib/templates/template7/inputs/publications.bib @@ -0,0 +1,44 @@ +%% start of file `publications.bib'. +%% Copyright 2006-2012 Xavier Danaux (xdanaux at gmail.com). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +@BOOK{book1, + author = {John Doe and Author 1}, + title = {Title}, + publisher = {Publisher}, + edition = {edition}, + year = {year}, +} + +@BOOK{book2, + author = {John Doe and Author 2}, + title = {Title}, + publisher = {Publisher}, + edition = {edition}, + year = {year}, +} + +@MISC{misc1, + author = {John Doe}, + title = {Title}, + year = {year}, +} + +@MISC{misc2, + author = {John Doe and Author 3}, + title = {Title}, + year = {year}, +} + +@MISC{misc3, + author = {John Doe}, + title = {Title}, + year = {year}, +} + + +%% end of file `publications.bib'. diff --git a/public/lib/templates/template7/inputs/template.tex b/public/lib/templates/template7/inputs/template.tex new file mode 100644 index 00000000..38d313b3 --- /dev/null +++ b/public/lib/templates/template7/inputs/template.tex @@ -0,0 +1,257 @@ +%% start of file `template.tex'. +%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +\documentclass[11pt,a4paper,sans]{moderncv} % possible options include font size ('10pt', '11pt' and '12pt'), paper size ('a4paper', 'letterpaper', 'a5paper', 'legalpaper', 'executivepaper' and 'landscape') and font family ('sans' and 'roman') + +% moderncv themes +\moderncvstyle{casual} % style options are 'casual' (default), 'classic', 'banking', 'oldstyle' and 'fancy' +\moderncvcolor{blue} % color options 'black', 'blue' (default), 'burgundy', 'green', 'grey', 'orange', 'purple' and 'red' +%\renewcommand{\familydefault}{\sfdefault} % to set the default font; use '\sfdefault' for the default sans serif font, '\rmdefault' for the default roman one, or any tex font name +%\nopagenumbers{} % uncomment to suppress automatic page numbering for CVs longer than one page + +% adjust the page margins +\usepackage[scale=0.75]{geometry} +\setlength{\footskip}{136.00005pt} % depending on the amount of information in the footer, you need to change this value. comment this line out and set it to the size given in the warning +%\setlength{\hintscolumnwidth}{3cm} % if you want to change the width of the column with the dates +%\setlength{\makecvheadnamewidth}{10cm} % for the 'classic' style, if you want to force the width allocated to your name and avoid line breaks. be careful though, the length is normally calculated to avoid any overlap with your personal info; use this at your own typographical risks... + +% font loading +% for luatex and xetex, do not use inputenc and fontenc +% see https://tex.stackexchange.com/a/496643 +\ifxetexorluatex + \usepackage{fontspec} + \usepackage{unicode-math} + \defaultfontfeatures{Ligatures=TeX} + \setmainfont{Latin Modern Roman} + \setsansfont{Latin Modern Sans} + \setmonofont{Latin Modern Mono} + \setmathfont{Latin Modern Math} +\else + \usepackage[utf8]{inputenc} + \usepackage[T1]{fontenc} + \usepackage{lmodern} +\fi + +% document language +\usepackage[english]{babel} % FIXME: using spanish breaks moderncv + +% personal data +\name{John}{Doe} +\title{Résumé title} % optional, remove / comment the line if not wanted +\born{4 July 1776} % optional, remove / comment the line if not wanted +\address{street and number}{postcode city}{country}% optional, remove / comment the line if not wanted; the "postcode city" and "country" arguments can be omitted or provided empty +\phone[mobile]{+1~(234)~567~890} % optional, remove / comment the line if not wanted; the optional "type" of the phone can be "mobile" (default), "fixed" or "fax" +\phone[fixed]{+2~(345)~678~901} +\phone[fax]{+3~(456)~789~012} +\email{john@doe.org} % optional, remove / comment the line if not wanted +\homepage{www.johndoe.com} % optional, remove / comment the line if not wanted + +% Social icons +\social[linkedin]{john.doe} % optional, remove / comment the line if not wanted +\social[xing]{john\_doe} % optional, remove / comment the line if not wanted +\social[twitter]{ji\_doe} % optional, remove / comment the line if not wanted +\social[github]{jdoe} % optional, remove / comment the line if not wanted +\social[gitlab]{jdoe} % optional, remove / comment the line if not wanted +\social[stackoverflow]{0000000/johndoe} % optional, remove / comment the line if not wanted +\social[bitbucket]{jdoe} % optional, remove / comment the line if not wanted +\social[skype]{jdoe} % optional, remove / comment the line if not wanted +\social[orcid]{0000-0000-000-000} % optional, remove / comment the line if not wanted +\social[researchgate]{jdoe} % optional, remove / comment the line if not wanted +\social[researcherid]{jdoe} % optional, remove / comment the line if not wanted +\social[telegram]{jdoe} % optional, remove / comment the line if not wanted +\social[whatsapp]{12345678901} % optional, remove / comment the line if not wanted +\social[signal]{12345678901} % optional, remove / comment the line if not wanted +\social[matrix]{@johndoe:matrix.org} % optional, remove / comment the line if not wanted +\social[googlescholar]{googlescholarid} % optional, remove / comment the line if not wanted + + +\extrainfo{additional information} % optional, remove / comment the line if not wanted +\photo[64pt][0.4pt]{picture} % optional, remove / comment the line if not wanted; '64pt' is the height the picture must be resized to, 0.4pt is the thickness of the frame around it (put it to 0pt for no frame) and 'picture' is the name of the picture file +\quote{Some quote} % optional, remove / comment the line if not wanted + +% bibliography adjustments (only useful if you make citations in your resume, or print a list of publications using BibTeX) +% to show numerical labels in the bibliography (default is to show no labels) +%\makeatletter\renewcommand*{\bibliographyitemlabel}{\@biblabel{\arabic{enumiv}}}\makeatother +\renewcommand*{\bibliographyitemlabel}{[\arabic{enumiv}]} +% to redefine the bibliography heading string ("Publications") +%\renewcommand{\refname}{Articles} + +% bibliography with mutiple entries +%\usepackage{multibib} +%\newcites{book,misc}{{Books},{Others}} +%---------------------------------------------------------------------------------- +% content +%---------------------------------------------------------------------------------- +\begin{document} +%\begin{CJK*}{UTF8}{gbsn} % to typeset your resume in Chinese using CJK +%----- resume --------------------------------------------------------- +\makecvtitle + +\section{Education} +\cventry{year--year}{Degree}{Institution}{City}{\textit{Grade}}{Description} % arguments 3 to 6 can be left empty +\cventry{year--year}{Degree}{Institution}{City}{\textit{Grade}}{Description} + +\section{Master thesis} +\cvitem{title}{\emph{Title}} +\cvitem{supervisors}{Supervisors} +\cvitem{description}{Short thesis abstract} + +\section{Experience} +\subsection{Vocational} +\cventry{year--year}{Job title}{Employer}{City}{}{General description no longer than 1--2 lines.\newline{} +Detailed achievements: +\begin{itemize} +\item Achievement 1 +\item Achievement 2 (with sub-achievements) + \begin{itemize} + \item Sub-achievement (a); + \item Sub-achievement (b), with sub-sub-achievements (don't do this!); + \begin{itemize} + \item Sub-sub-achievement i; + \item Sub-sub-achievement ii; + \item Sub-sub-achievement iii; + \end{itemize} + \item Sub-achievement (c); + \end{itemize} +\item Achievement 3 +\item Achievement 4 +\end{itemize}} +\cventry{year--year}{Job title}{Employer}{City}{}{Description line 1\newline{}Description line 2\newline{}Description line 3} +\subsection{Miscellaneous} +\cventry{year--year}{Job title}{Employer}{City}{}{Description} + +\section{Languages} +\cvitemwithcomment{Language 1}{Skill level}{Comment} +\cvitemwithcomment{Language 2}{Skill level}{Comment} +\cvitemwithcomment{Language 3}{Skill level}{Comment} +\cvitemwithcomment{Language 4}{Skill level}{Comment} + +\section{Computer skills} +\cvdoubleitem{category 1}{XXX, YYY, ZZZ}{category 4}{XXX, YYY, ZZZ} +\cvdoubleitem{category 2}{XXX, YYY, ZZZ}{category 5}{XXX, YYY, ZZZ} +\cvdoubleitem{category 3}{XXX, YYY, ZZZ}{category 6}{XXX, YYY, ZZZ} + +\section{Skill matrix} +\cvitem{Skill matrix}{Alternatively, provide a skill matrix to show off your skills} +%% Skill matrix as an alternative to rate one's skills, computer or other. + +%% Adjusts width of skill matrix columns. +%% Usage \setcvskillcolumns[<width>][<factor>][<exp_width>] +%% <width>, <exp_width> should be lengths smaller than \textwidth, <factor> needs to be between 0 and 1. +%% Examples: +% \setcvskillcolumns[5em][][]% adjust first column. Same as \setcvskillcolumns[5em] +% \setcvskillcolumns[][0.45][]% adjust third (skill) column. Same as \setcvskillcolumns[][0.45] +% \setcvskillcolumns[][][\widthof{``Year''}]% adjust fourth (years) column. +% \setcvskillcolumns[][0.45][\widthof{``Year''}]% +% \setcvskillcolumns[\widthof{``Languag''}][0.48][] +% \setcvskillcolumns[\widthof{``Languag''}]% + +%% Adjusts width of legend columns. Usage \setcvskilllegendcolumns[<width>][<factor>] +%% <factor> needs to be between 0 and 1. <width> should be a length smaller than \textwidth +%% Examples: +% \setcvskilllegendcolumns[][0.45] +% \setcvskilllegendcolumns[\widthof{``Legend''}][0.45] +% \setcvskilllegendcolumns[0ex][0.46]% this is usefull for the banking style + +%% Add a legend if you are using \cvskill{<1-5>} command or \cvskillentry +%% Usage \cvskilllegend[*][<post_padding>][<first_level>][<second_level>][<third_level>][<fourth_level>][<fifth_level>]{<name>} +% \cvskilllegend % insert default legend without lines +\cvskilllegend*[1em]{}% adjust post spacing +% \cvskilllegend*{Legend}% Alternatively add a description string +%% adjust the legend entries for other languages, here German +% \cvskilllegend[0.2em][Grundkenntnisse][Grundkenntnisse und eigene Erfahrung in Projekten][Umfangreiche Erfahrung in Projekten][Vertiefte Expertenkenntnisse][Experte\,/\,Spezialist]{Legende} + +%% Alternative legend style with the first three skill levels in one column +%% Usage \cvskillplainlegend[*][<post_padding>][<first_level>][<second_level>][<third_level>][<fourth_level>][<fifth_level>]{<name>} +% \setcvskilllegendcolumns[][0.6]% works for classic, casual, banking +% \setcvskilllegendcolumns[][0.55]% works better for oldstyle and fancy +% \cvskillplainlegend{} +% \cvskillplainlegend[0.2em][Grundkenntnisse][Grundkenntnisse und eigene Erfahrung in Projekten][Umfangreiche Erfahrung in Projekten][Vertiefte Expertenkenntnisse][Experte/Guru]{Legende} + +%% Add a head of the skill matrix table with descriptions. +%% Usage \cvskillhead[<post_padding>][<Level>][<Skill>][<Years>][<Comment>]% +\cvskillhead[-0.1em]% this inserts the standard legend in english and adjust padding +%% Adjust head of the skill matrix for other languages +% \cvskillhead[0.25em][Level][F\"ahigkeit][Jahre][Bemerkung] + +%% \cvskillentry[*][<post_padding>]{<skill_cathegory>}{<0-5>}{<skill_name>}{<years_of_experience>}{<comment>}% +%% Example usages: +\cvskillentry*{Language:}{3}{Python}{2}{I'm so experienced in Python and have realised a million projects. At least.} +\cvskillentry{}{2}{Lilypond}{14}{So much sheet music! Man, I'm the best!} +\cvskillentry{}{3}{\LaTeX}{14}{Clearly I rock at \LaTeX} +\cvskillentry*{OS:}{3}{Linux}{2}{I only use Archlinux btw}% notice the use of the starred command and the optional +\cvskillentry*[1em]{Methods}{4}{SCRUM}{8}{SCRUM master for 5 years} +%% \cvskill{<0-5>} command +% \cvitem{\textbackslash{cvskill}:}{Skills can be visually expressed by the \textbackslash{cvskill} command, e.g. \cvskill{2}} + +\section{Interests} +\cvitem{hobby 1}{Description} +\cvitem{hobby 2}{Description} +\cvitem{hobby 3}{Description} + +\section{Extra 1} +\cvlistitem{Item 1} +\cvlistitem{Item 2} +\cvlistitem{Item 3. This item is particularly long and therefore normally spans over several lines. Did you notice the indentation when the line wraps?} + +\section{Extra 2} +\cvlistdoubleitem{Item 1}{Item 4} +\cvlistdoubleitem{Item 2}{Item 5\cite{book2}} +\cvlistdoubleitem{Item 3}{Item 6. Like item 3 in the single column list before, this item is particularly long to wrap over several lines.} + +\section{References} +\begin{cvcolumns} + \cvcolumn{Category 1}{\begin{itemize}\item Person 1\item Person 2\item Person 3\end{itemize}} + \cvcolumn{Category 2}{Amongst others:\begin{itemize}\item Person 1, and\item Person 2\end{itemize}(more upon request)} + \cvcolumn[0.5]{All the rest \& some more}{\textit{That} person, and \textbf{those} also (all available upon request).} +\end{cvcolumns} + +% Publications from a BibTeX file without multibib +% for numerical labels: \renewcommand{\bibliographyitemlabel}{\@biblabel{\arabic{enumiv}}}% CONSIDER MERGING WITH PREAMBLE PART +% to redefine the heading string ("Publications"): \renewcommand{\refname}{Articles} +\nocite{*} +\bibliographystyle{plain} +\bibliography{publications} % 'publications' is the name of a BibTeX file + +% Publications from a BibTeX file using the multibib package +%\section{Publications} +%\nocitebook{book1,book2} +%\bibliographystylebook{plain} +%\bibliographybook{publications} % 'publications' is the name of a BibTeX file +%\nocitemisc{misc1,misc2,misc3} +%\bibliographystylemisc{plain} +%\bibliographymisc{publications} % 'publications' is the name of a BibTeX file + +\clearpage +%----- letter --------------------------------------------------------- +% recipient data +\recipient{Company Recruitment team}{Company, Inc.\\123 somestreet\\some city} +\date{January 01, 1984} +\opening{Dear Sir or Madam,} +\closing{Yours faithfully,} +\enclosure[Attached]{curriculum vit\ae{}} % use an optional argument to use a string other than "Enclosure", or redefine \enclname +\makelettertitle + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ullamcorper neque sit amet lectus facilisis sed luctus nisl iaculis. Vivamus at neque arcu, sed tempor quam. Curabitur pharetra tincidunt tincidunt. Morbi volutpat feugiat mauris, quis tempor neque vehicula volutpat. Duis tristique justo vel massa fermentum accumsan. Mauris ante elit, feugiat vestibulum tempor eget, eleifend ac ipsum. Donec scelerisque lobortis ipsum eu vestibulum. Pellentesque vel massa at felis accumsan rhoncus. + +Suspendisse commodo, massa eu congue tincidunt, elit mauris pellentesque orci, cursus tempor odio nisl euismod augue. Aliquam adipiscing nibh ut odio sodales et pulvinar tortor laoreet. Mauris a accumsan ligula. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse vulputate sem vehicula ipsum varius nec tempus dui dapibus. Phasellus et est urna, ut auctor erat. Sed tincidunt odio id odio aliquam mattis. Donec sapien nulla, feugiat eget adipiscing sit amet, lacinia ut dolor. Phasellus tincidunt, leo a fringilla consectetur, felis diam aliquam urna, vitae aliquet lectus orci nec velit. Vivamus dapibus varius blandit. + +Duis sit amet magna ante, at sodales diam. Aenean consectetur porta risus et sagittis. Ut interdum, enim varius pellentesque tincidunt, magna libero sodales tortor, ut fermentum nunc metus a ante. Vivamus odio leo, tincidunt eu luctus ut, sollicitudin sit amet metus. Nunc sed orci lectus. Ut sodales magna sed velit volutpat sit amet pulvinar diam venenatis. + +Albert Einstein discovered that $e=mc^2$ in 1905. + +\[ e=\lim_{n \to \infty} \left(1+\frac{1}{n}\right)^n \] + +\makeletterclosing + +%\clearpage\end{CJK*} % if you are typesetting your resume in Chinese using CJK; the \clearpage is required for fancyhdr to work correctly with CJK, though it kills the page numbering by making \lastpage undefined +\end{document} + + +%% end of file `template.tex'. + diff --git a/public/lib/templates/template7/inputs/tweaklist.sty b/public/lib/templates/template7/inputs/tweaklist.sty new file mode 100644 index 00000000..3739c95f --- /dev/null +++ b/public/lib/templates/template7/inputs/tweaklist.sty @@ -0,0 +1,56 @@ +%% start of file `tweaklist.sty'. +%% Original by Jakob Schiotz, downloaded from http://dcwww.camd.dtu.dk/~schiotz/comp/LatexTips/tweaklist.sty; not found on ctan. +%% Modified by Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv). +% +% The tweaklist.sty package redefines the itemize, enumerate and description packages, so that all parameters can be adjusted. +% This was done by copying the original definitions, and adding "hook commands" that are executed when entering the environment. +% The hook commands are initially empty, but can be redefined with \renewcommand. +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License version 1.3c, +% available at http://www.latex-project.org/lppl/. + + +% hooks for the itemize environment +\def\itemhook{} +\def\itemhooki{} +\def\itemhookii{} +\def\itemhookiii{} +\def\itemhookiv{} +% hooks for the enumerate environment +\def\enumhook{} +\def\enumhooki{} +\def\enumhookii{} +\def\enumhookiii{} +\def\enumhookiv{} +% hook for the description environment +\def\deschook{} +% original environment definitions, with hooks added +\def\enumerate{% + \ifnum \@enumdepth >\thr@@\@toodeep\else + \advance\@enumdepth\@ne + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + \expandafter + \list + \csname label\@enumctr\endcsname + {% + \enumhook \csname enumhook\romannumeral\the\@enumdepth\endcsname% + \usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}% + }% + \fi} +\def\itemize{% + \ifnum \@itemdepth >\thr@@\@toodeep\else + \advance\@itemdepth\@ne + \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% + \expandafter + \list + \csname\@itemitem\endcsname + {% + \itemhook \csname itemhook\romannumeral\the\@itemdepth\endcsname% + \def\makelabel##1{\hss\llap{##1}}% + }% + \fi} +\newenvironment{description} + {\list{}{\deschook\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} diff --git a/public/lib/templates/template8/index.ts b/public/lib/templates/template8/index.ts new file mode 100644 index 00000000..750da9f2 --- /dev/null +++ b/public/lib/templates/template8/index.ts @@ -0,0 +1,314 @@ +import { stripIndent, source } from 'common-tags' +import { WHITESPACE } from '../constants' +import type { FormValues, Generator } from '../../../types' + +const generator: Generator = { + profileSection(basics) { + if (!basics) { + return '' + } + + const { name, email, phone = '', location = {}, website } = basics + + let addressLine = '' + let contactsLine = '' + + if (location.address && phone) { + addressLine = `\\address{${location.address} \\linebreak ${phone}}` + } else if (location.address || phone) { + addressLine = `\\address{${location.address || phone}}` + } + + if (email && website) { + contactsLine = `\\contacts{${email} \\linebreak ${website}}` + } else if (email || website) { + contactsLine = `\\contacts{${email || website}}` + } + + return ` + % Set applicant's personal data for header + \\name{${name || ''}} + ${addressLine} + ${contactsLine} + ` + }, + + educationSection(education, heading) { + if (!education) { + return '' + } + + return source` + \\begin{cvsection}{${heading || 'Education'}} + ${education.map((school) => { + const { + institution, + studyType = '', + area = '', + score, + location, + startDate, + endDate = '' + } = school + + let degreeLine = '' + + if (studyType && area) { + degreeLine = `${studyType} in ${area}.` + } else if (studyType || area) { + degreeLine = (studyType || area) + '.' + } + + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } + + if (score) { + degreeLine += ` GPA: ${score}` + } + + return stripIndent` + \\begin{cvsubsection}{${location || ''}}{${institution || ''}}{${dateRange || '' + }} + \\begin{itemize} + \\item ${degreeLine} + \\end{itemize} + \\end{cvsubsection} + ` + })} + \\end{cvsection} + ` + }, + + workSection(work, heading) { + if (!work) { + return '' + } + + return source` + \\begin{cvsection}{${heading || 'Experience'}} + ${work.map((job) => { + const { + company, + position, + location, + startDate, + endDate = '', + highlights + } = job + + let dateRange = '' + let highlightLines = '' + + if (startDate && endDate) { + dateRange = `${startDate} -- ${endDate}` + } else if (startDate) { + dateRange = `${startDate} -- Present` + } else { + dateRange = endDate + } + + if (highlights) { + highlightLines = source` + \\begin{itemize}% + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + } + + return stripIndent` + \\begin{cvsubsection}{${position || ''}}{${company || ''}}{${dateRange || '' + }} + ${location || ''} + ${highlightLines || ''} + \\end{cvsubsection} + ` + })} + \\end{cvsection} + ` + }, + + skillsSection(skills, heading) { + if (!skills) { + return '' + } + + return source` + \\begin{cvsection}{${heading || 'Skills'}} + \\begin{cvsubsection}{}{}{} + \\begin{itemize} + ${skills.map((skill) => { + const { name, keywords = [] } = skill + return `\\item ${name ? `${name}: ` : ''} ${keywords.join(', ') || ''}` + })} + \\end{itemize} + \\end{cvsubsection} + \\end{cvsection} + ` + }, + + projectsSection(projects, heading) { + if (!projects) { + return '' + } + + return source` + \\begin{cvsection}{${heading || 'Projects'}} + \\begin{cvsubsection}{}{}{} + \\begin{itemize} + \\setlength\\itemsep{3pt} + ${projects.map((project) => { + const { name, highlights = [], keywords = [], url } = project + + let line = '' + + if (name) { + line += `\\textbf{${name}} ` + } + + if (url) { + line += `(${url}) ` + } + + let highlightLines = '' + if (highlights.length) { + highlightLines = highlights + .map((highlight) => `\\item ${highlight}`) + .join('\n') + } + + if (keywords) { + line += ` ${keywords.join(', ')}` + } + + return `\\item ${line}\n${highlightLines}` + })} + \\end{itemize} + \\end{cvsubsection} + \\end{cvsection} + ` + }, + + awardsSection(awards, heading) { + if (!awards) { + return '' + } + + return source` + \\begin{cvsection}{${heading || 'Awards'}} + \\begin{cvsubsection}{}{}{} + \\begin{itemize} + \\setlength\\itemsep{3pt} + ${awards.map((award) => { + const { title, summary, date, awarder } = award + + let line = '' + + if (title) { + line += `\\textbf{${title}} ` + } + + if (awarder) { + line += `(${awarder}) ` + } + + if (summary) { + line += ` ${summary}` + } + + if (date) { + line += ` ${date}` + } + + return `\\item ${line}` + })} + \\end{itemize} + \\end{cvsubsection} + \\end{cvsection} + ` + }, + + resumeHeader() { + return stripIndent` + %% The MIT License (MIT) + %% + %% Copyright (c) 2015 Daniil Belyakov + %% + %% Permission is hereby granted, free of charge, to any person obtaining a copy + %% of this software and associated documentation files (the "Software"), to deal + %% in the Software without restriction, including without limitation the rights + %% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + %% copies of the Software, and to permit persons to whom the Software is + %% furnished to do so, subject to the following conditions: + %% + %% The above copyright notice and this permission notice shall be included in all + %% copies or substantial portions of the Software. + %% + %% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + %% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + %% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + %% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + %% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + %% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + %% SOFTWARE. + ` + } +} + +function template8(values: FormValues) { + const { headings = {} } = values + + return stripIndent` + ${generator.resumeHeader()} + % The font could be set to Windows-specific Calibri by using the 'calibri' option + \\documentclass[]{mcdowellcv} + + % For mathematical symbols + \\usepackage{amsmath} + + ${generator.profileSection(values.basics)} + + \\begin{document} + % Print the header + \\makeheader + ${values.sections + .map((section) => { + switch (section) { + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection( + values.projects, + headings.projects + ) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n')} + ${WHITESPACE} + \\end{document} + ` +} + +export default template8 diff --git a/public/lib/templates/template8/inputs/mcdowellcv.cls b/public/lib/templates/template8/inputs/mcdowellcv.cls new file mode 100644 index 00000000..786d86cc --- /dev/null +++ b/public/lib/templates/template8/inputs/mcdowellcv.cls @@ -0,0 +1,192 @@ +%% The MIT License (MIT) +%% +%% Copyright (c) 2015 Daniil Belyakov +%% +%% Permission is hereby granted, free of charge, to any person obtaining a copy +%% of this software and associated documentation files (the "Software"), to deal +%% in the Software without restriction, including without limitation the rights +%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%% copies of the Software, and to permit persons to whom the Software is +%% furnished to do so, subject to the following conditions: +%% +%% The above copyright notice and this permission notice shall be included in all +%% copies or substantial portions of the Software. +%% +%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +%% SOFTWARE. +\ProvidesClass{mcdowellcv}[2015/12/15 v1.1.0 McDowell CV class] + +% Set up the fonts according to options +\def\mainfontsize{11pt} +\def\mainfontface{Times New Roman} + +\DeclareOption{calibri}{% + \def\mainfontface{Calibri} +} + +\ProcessOptions\relax + +% Set font size and paper type +\LoadClass[letterpaper,\mainfontsize]{article} + +% Set document margins +\usepackage[left=0.75in,top=0.6in,right=0.75in,bottom=0.6in]{geometry} + +% Set font face +\usepackage{fontspec} + +% Remove paragraph indentation +\usepackage[parfill]{parskip} + +% Required for boldface (\bf and \bfseries) tabular columns +\usepackage{array} + +% Required for ifthenelse statements +\usepackage{etoolbox} + +% Suppress page numbers +\pagestyle{empty} + +% Flexible tables +\usepackage{tabu} + +% For custom margins +\usepackage{changepage} + +% To customize lists +\usepackage{enumitem} +% Remove left margin from lists, suppress vertical item separation and set top +% separation to a negative value to suppress a single parskip before lists +\setlist{leftmargin=*, noitemsep, topsep=-1\parskip} + +% For spcaed small caps +\usepackage{microtype} + +\DeclareMicrotypeSet*{smallcapsi} { + encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2}, + shape = {sc*,si,scit} +} + +%-------------------------------------------------------------------------------- +% Constants - +%-------------------------------------------------------------------------------- +\def\afterheaderspace{3pt} +\def\beforesectionheaderspace{4.75pt} +\def\sectionheadermargin{6pt} +\def\aftersectionheaderspace{-4pt} +\def\sectionheaderhrlueheight{0.5pt} +\def\aftersinglelinesubsectionheaderspace{-6pt} +\def\afterdoublelinesubsectionheaderspace{0pt} +\def\aftermultilinesubsectionheaderspace{-6pt} +\def\afteremptysubsectionheaderspace{3pt} +\def\subsectionmargin{9pt} +\def\aftersubsectionspace{3pt} + +%-------------------------------------------------------------------------------- +% Header Setup and Printing - +%-------------------------------------------------------------------------------- + +% Address +\makeatletter + +\newcommand\address[1]{\def\@address{#1}} +\address{} + +\newcommand\printaddress{ + \small{\@address} +} + +\makeatother + +% Name +\makeatletter + +\newcommand\name[1]{\def\@name{#1}} +\name{} + +\newcommand\printname{ + \textbf{\LARGE\textls[110]{\textsc{\@name}}} +} + +\makeatother + +% Contacts +\makeatletter + +\newcommand\contacts[1]{\def\@contacts{#1}} +\contacts{} + +\newcommand\printcontacts{ + \small{\@contacts} +} + +\makeatother + +\makeatletter +\newcommand\makeheader{ + \begin{center} + \begin{tabu} to 1\textwidth { X[l,m] X[2,c,m] X[r,m] } + \printaddress & \printname & \printcontacts \\ + \end{tabu} + \end{center} + \vspace*{\afterheaderspace} +} +\makeatother + +%-------------------------------------------------------------------------------- +% Sections and Subsections - +%-------------------------------------------------------------------------------- + +% Print a section header +\makeatletter +\newenvironment{cvsection}[1]{ + \vspace*{\beforesectionheaderspace} + % Set text margins to equal \tabcolsep (6pt by default) + \begin{adjustwidth}{\sectionheadermargin}{\sectionheadermargin} + \textsc{\textbf{#1}} + \end{adjustwidth} + \smallskip + \hrule height \sectionheaderhrlueheight + \vspace*{\aftersectionheaderspace} +}{} +\makeatother + +% Print a subsection +\makeatletter +% Define toggles checking if titles were defined +\newtoggle{lefttitledefined} +\newtoggle{centertitledefined} +\newtoggle{righttitledefined} + +\newenvironment{cvsubsection}[4][1]{ + \notblank{#2}{\toggletrue{lefttitledefined}}{} + \notblank{#3}{\toggletrue{centertitledefined}}{} + \notblank{#4}{\toggletrue{righttitledefined}}{} + \ifboolexpr{togl {lefttitledefined} or togl {centertitledefined} or togl {righttitledefined}}{ + \begin{tabu} to 1\textwidth { X[l,p] X[c,p] X[r,p] } + \textbf{#2} & \textbf{#3} & \textbf{#4} \\ + \end{tabu} + % Add space according to the specidied number of lines + \ifnumcomp{#1}{=}{1}{\vspace*{\aftersinglelinesubsectionheaderspace}}{ + \ifnumcomp{#1}{=}{2}{\vspace*{\afterdoublelinesubsectionheaderspace}}{ + \vspace*{\aftermultilinesubsectionheaderspace} + } + } + }{ + \vspace*{\afteremptysubsectionheaderspace} + } + \togglefalse{lefttitledefined} + \togglefalse{centertitledefined} + \togglefalse{righttitledefined} + \begin{adjustwidth}{\subsectionmargin}{\subsectionmargin} +} +{ + \end{adjustwidth} + \vspace*{\aftersubsectionspace} +} +\makeatother \ No newline at end of file diff --git a/public/lib/templates/template9/index.ts b/public/lib/templates/template9/index.ts new file mode 100644 index 00000000..7ea96f77 --- /dev/null +++ b/public/lib/templates/template9/index.ts @@ -0,0 +1,355 @@ +import { stripIndent, source } from 'common-tags' +import { WHITESPACE } from '../constants' +import type { FormValues, Generator } from '../../../types' + +const generator: Generator = { + profileSection(basics) { + if (!basics) { + return '' + } + + const { name, email, phone, location = {}, website } = basics + const info = [email, phone, location.address, website] + .filter(Boolean) + .join(' | ') + + return stripIndent` + \\MyName{${name || ''}} + \\bigskip + {\\small \\hfill ${info || ''}} + ` + }, + + educationSection(education, heading) { + if (!education) { + return '' + } + + const lastSchoolIndex = education.length - 1 + + return source` + %%% Education + %%% ------------------------------------------------------------ + \\NewPart{${heading || 'Education'}}{} + ${education.map((school, i) => { + const { + institution = '', + studyType, + area = '', + score = '', + location = '', + startDate = '', + endDate = '' + } = school + + let degreeLine = '' + let nameLine = '' + + if (studyType && area) { + degreeLine = `${studyType} ${area}` + } else if (studyType || area) { + degreeLine = studyType || area + } + + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} - ${endDate}` + } else if (startDate) { + dateRange = `${startDate} - Present` + } else { + dateRange = endDate + } + + if (institution && location) { + nameLine += `${institution}, ${location}` + } else if (institution || location) { + nameLine = institution || location + } + + if (score) { + nameLine += ` ${score}` + } + + return stripIndent` + \\EducationEntry + {${degreeLine}} + {${dateRange || ''}} + {${nameLine}} + ${i < lastSchoolIndex ? '\\sepspace' : ''} + ` + })} + ` + }, + + workSection(work, heading) { + if (!work) { + return '' + } + + const lastJobIndex = work.length - 1 + + return source` + %%% Work experience + %%% ------------------------------------------------------------ + + \\NewPart{${heading || 'Experience'}}{} + + ${work.map((job, i) => { + const { + company, + position, + location, + startDate, + endDate = '', + highlights + } = job + + const nameLine = [company, location].filter(Boolean).join(', ') + let dateRange = '' + let dutyLines = '' + + if (startDate && endDate) { + dateRange = `${startDate} - ${endDate}` + } else if (startDate) { + dateRange = `${startDate} - Present` + } else { + dateRange = endDate + } + + if (highlights) { + dutyLines = source` + \\begin{itemize} \\itemsep -1pt + ${highlights.map((duty) => `\\item ${duty}`)} + \\end{itemize} + ` + } + + return stripIndent` + \\WorkEntry + {${position || ''}} + {${dateRange || ''}} + {${nameLine}} + {${dutyLines}} + ${i < lastJobIndex ? '\\sepspace' : ''} + ` + })} + ` + }, + + skillsSection(skills, heading) { + if (!skills) { + return '' + } + + return source` + %%% Skills + %%% ------------------------------------------------------------ + \\NewPart{${heading || 'Skills'}}{} + ${skills.map((skill) => { + const { name, keywords = [] } = skill + return `\\SkillsEntry{${name || ''}}{${keywords.join(', ')}}` + })} + ` + }, + + projectsSection(projects, heading) { + if (!projects) { + return '' + } + + const lastProjectIndex = projects.length - 1 + + return source` + %%% Projects + %%% ------------------------------------------------------------ + \\NewPart{${heading || 'Projects'}}{} + + ${projects.map((project, i) => { + const { name, keywords = [], url, highlights = [] } = project + + const highlightList = + highlights.length > 0 + ? ` + \\begin{itemize} + ${highlights.map((highlight) => `\\item ${highlight}`).join('\n')} + \\end{itemize} + ` + : '' + + return stripIndent` + \\ProjectEntry{${name || ''}}{${url || ''}} + {${keywords.join(', ')}} + ${highlightList} + ${i < lastProjectIndex ? '\\sepspace' : ''} + ` + })} + ` + }, + + awardsSection(awards, heading) { + if (!awards) { + return '' + } + + const lastAwardIndex = awards.length - 1 + + return source` + %%% Awards + %%% ------------------------------------------------------------ + \\NewPart{${heading || 'Awards'}}{} + + ${awards.map((award, i) => { + const { title, summary, date, awarder } = award + + return stripIndent` + \\AwardEntry{${title || ''}}{${awarder || ''}} + {${date || ''}} + {${summary || ''}} + ${i < lastAwardIndex ? '\\sepspace' : ''} + ` + })} + ` + }, + + resumeHeader() { + return stripIndent` + \\usepackage[english]{babel} + \\usepackage[utf8]{inputenc} + \\usepackage[T1]{fontenc} + \\usepackage{lmodern} + \\usepackage[protrusion=true,expansion=true]{microtype} + \\usepackage[svgnames]{xcolor} % Colours by their 'svgnames' + \\usepackage[margin=0.75in]{geometry} + \\textheight=700px + \\usepackage{url} + \\usepackage{lmodern} % Allow arbitrary font sizes + \\usepackage{textcomp} + + %% Define a new 'modern' style for the url package that will use a smaller font. + \\makeatletter + \\def\\url@modernstyle{ + \\@ifundefined{selectfont}{\\def\\UrlFont{\\sf}}{\\def\\UrlFont{}}} + \\makeatother + \\urlstyle{modern} %% And use the newly defined style. + + \\frenchspacing % Better looking spacings after periods + \\pagestyle{empty} % No pagenumbers/headers/footers + + \\renewcommand{\\familydefault}{\\sfdefault} + + %%% Custom sectioning (sectsty package) + %%% ------------------------------------------------------------ + \\usepackage{sectsty} + + \\sectionfont{ % Change font of \\section command + \\usefont{OT1}{phv}{b}{n}% % bch-b-n: CharterBT-Bold font + \\sectionrule{0pt}{0pt}{-5pt}{3pt}} + + %%% Macros + %%% ------------------------------------------------------------ + \\newlength{\\spacebox} + \\settowidth{\\spacebox}{8888888888} % Box to align text + \\newcommand{\\sepspace}{\\vspace*{1em}} % Vertical space macro + + \\newcommand{\\MyName}[1]{ % Name + \\Huge \\usefont{OT1}{phv}{b}{n} \\hfill #1 + \\par \\normalsize \\normalfont} + + \\newcommand{\\MySlogan}[1]{ % Slogan (optional) + \\large \\usefont{OT1}{phv}{m}{n}\\hfill \\textit{#1} + \\par \\normalsize \\normalfont} + + \\newcommand{\\NewPart}[1]{\\section*{\\uppercase{#1}}} + + \\newcommand{\\PersonalEntry}[2]{ + \\noindent\\hangindent=2em\\hangafter=0 % Indentation + \\parbox{\\spacebox}{ % Box to align text + \\textit{#1}} % Entry name (birth, address, etc.) + \\hspace{1.5em} #2 \\par} % Entry value + + \\newcommand{\\SkillsEntry}[2]{ % Same as \\PersonalEntry + \\noindent\\hangindent=2em\\hangafter=0 % Indentation + \\parbox{\\spacebox}{ % Box to align text + \\textit{#1}} % Entry name (birth, address, etc.) + \\hspace{1.5em} #2 \\par} % Entry value + + \\newcommand{\\AwardsEntry}[2]{ % Same as \\PersonalEntry + \\noindent\\hangindent=2em\\hangafter=0 % Indentation + \\parbox{\\spacebox}{ % Box to align text + \\textit{#1}} % Entry name (birth, address, etc.) + \\hspace{1.5em} #2 \\par} % Entry value + + \\newcommand{\\EducationEntry}[4]{ + \\noindent \\textbf{#1} \\hfill % Study + \\colorbox{Black}{ + \\parbox{8.5em}{ + \\hfill\\color{White}#2}} \\par % Duration + \\noindent \\textit{#3} \\par % School + \\noindent\\hangindent=2em\\hangafter=0 \\small #4 % Description + \\normalsize \\par} + + \\newcommand{\\WorkEntry}[4]{ % Same as \\EducationEntry + \\noindent \\textbf{#1} \\hfill % Jobname + \\colorbox{Black}{% + \\parbox{9em}{% + \\hfill\\color{White}#2}} \\par % Duration + \\noindent \\textit{#3} \\par % Company + \\noindent\\hangindent=2em\\hangafter=0 \\small #4 % Description + \\normalsize \\par} + + \\newcommand{\\ProjectEntry}[4]{ % Similar to \\EducationEntry + \\noindent \\textbf{#1} \\noindent \\textit{#3} \\hfill {#2} \\par + \\noindent \\small #4 % Description + \\normalsize \\par} + + \\newcommand{\\AwardEntry}[4]{ % Similar to \\EducationEntry + \\noindent \\textbf{#1} \\noindent \\textit{#3} \\hfill {#2} \\par + \\noindent \\small #4 % Description + \\normalsize \\par} + ` + } +} + +function template9(values: FormValues) { + const { headings = {} } = values + + return stripIndent` + \\documentclass[fontsize=11pt]{article} + ${generator.resumeHeader()} + \\begin{document} + ${values.sections + .map((section) => { + switch (section) { + case 'profile': + return generator.profileSection(values.basics) + + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection(values.projects, headings.projects) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n')} + ${WHITESPACE} + \\end{document} + ` +} + +export default template9 diff --git a/public/types.ts b/public/types.ts new file mode 100644 index 00000000..ded5e930 --- /dev/null +++ b/public/types.ts @@ -0,0 +1,134 @@ +export type Location = { + address?: string + postalCode?: string + city?: string + countryCode?: string + region?: string +} + +export type Profile = { + url?: string +} + +export type Basics = { + name?: string + email?: string + phone?: string + location?: Location + profiles?: Profile[] // TODO: revisit how profiles gets rendered + + // non-standard attributes + website?: string +} + +export type Work = { + name?: string + company?: string // non-standard + + position?: string + startDate?: string + endDate?: string + summary?: string + highlights: string[] + + // non-standard attributes + location: string +} + +export type Volunteer = { + organization?: string + position?: string + startDate?: string + endDate?: string + summary?: string + highlights?: string[] +} + +export type Education = { + institution?: string + area?: string + studyType?: string + startDate?: string + endDate?: string + score?: string + + // non-standard attributes + location: string +} + +export type Award = { + title?: string + date?: string + awarder?: string + summary?: string +} + +export type Publication = { + name?: string + publisher?: string + releaseDate?: string + url?: string + summary?: string +} + +export type Skill = { + name?: string + level?: string + keywords?: string[] +} + +export type Project = { + name?: string + description?: string + highlights?: string[] + keywords?: string[] + url?: string + startDate?: string + endDate?: string +} + +// Based on the [JSON Resume](http://jsonresume.org/) standard with extensions +// added as needed +export type Resume = { + basics?: Basics + work?: Work[] + volunteer?: Volunteer[] + education?: Education[] + awards?: Award[] + publications?: Publication[] + skills?: Skill[] + projects?: Project[] +} + +export type FormValues = Resume & { + headings: { [K in keyof Resume]?: string } + sections: (keyof Resume | 'profile' | 'templates' | string)[] //TODO: Fix this lmfao + selectedTemplate: number +} + +export interface FormState { + isGenerating: boolean +} + +export type Generator = { + resumeHeader: () => string + profileSection: (basics?: Basics) => string + educationSection: (education?: Array<Education>, heading?: string) => string + workSection: (work?: Array<Work>, heading?: string) => string + skillsSection: (skills?: Array<Skill>, heading?: string) => string + projectsSection: (projects?: Array<Project>, heading?: string) => string + awardsSection: (awards?: Array<Award>, heading?: string) => string +} + +export type LaTeXOpts = { + cmd?: string + inputs?: string + fonts?: string + passes?: number + errorLogs?: string +} + +export type TemplateData = { + texDoc: string + opts: LaTeXOpts +} diff --git a/resume.tex b/resume.tex new file mode 100644 index 00000000..6886ded9 --- /dev/null +++ b/resume.tex @@ -0,0 +1,164 @@ +\documentclass[a4paper]{article} + \usepackage{fullpage} + \usepackage{amsmath} + \usepackage{amssymb} + \usepackage{textcomp} + \usepackage[utf8]{inputenc} + \usepackage[T1]{fontenc} + \textheight=10in + \pagestyle{empty} + \raggedright + \usepackage[left=0.8in,right=0.8in,bottom=0.8in,top=0.8in]{geometry} + + %\renewcommand{\encodingdefault}{cg} +%\renewcommand{\rmdefault}{lgrcmr} + +\def\bull{\vrule height 0.8ex width .7ex depth -.1ex } + +% DEFINITIONS FOR RESUME %%%%%%%%%%%%%%%%%%%%%%% + +\newcommand{\area} [2] { + \vspace*{-9pt} + \begin{verse} + \textbf{#1} #2 + \end{verse} +} + +\newcommand{\lineunder} { + \vspace*{-8pt} \\ + \hspace*{-18pt} \hrulefill \\ +} + +\newcommand{\header} [1] { + {\hspace*{-18pt}\vspace*{6pt} \textsc{#1}} + \vspace*{-6pt} \lineunder +} + +\newcommand{\employer} [3] { + { \textbf{#1} (#2)\\ \underline{\textbf{\emph{#3}}}\\ } +} + +\newcommand{\contact} [3] { + \vspace*{-10pt} + \begin{center} + {\Huge \scshape {#1}}\\ + #2 \\ #3 + \end{center} + \vspace*{-8pt} +} + +\newenvironment{achievements}{ + \begin{list} + {$\bullet$}{\topsep 0pt \itemsep -2pt}}{\vspace*{4pt} + \end{list} +} + +\newcommand{\schoolwithcourses} [4] { + \textbf{#1} #2 $\bullet$ #3\\ + #4 \\ + \vspace*{5pt} +} + +\newcommand{\school} [4] { + \textbf{#1} #2 $\bullet$ #3\\ + #4 \\ +} +% END RESUME DEFINITIONS %%%%%%%%%%%%%%%%%%%%%%% + + \begin{document} + \vspace*{-40pt} + + + +%==== Profile ====% +\vspace*{-10pt} +\begin{center} + {\Huge \scshape {Bill Zhang}}\\ + San Jose, CA $\cdot$ jzhang71@usc.edu $\cdot$ 408-585-8267 $\cdot$ https://bzhang.info/\\ +\end{center} + +%==== Education ====% + \header{Education} + \textbf{University of Southern California}\hfill Los Angeles, CA\\ +Master of Science in Computer Science - Artificial Intelligence \hfill August 2023 - Present\\ +\vspace{2mm} + \textbf{University of California, Santa Cruz}\hfill Santa Cruz, CA\\ +Bachelor of Science in Computer Science \hfill September 2020 - March 2023\\ +\vspace{2mm} + +%==== Experience ====% + \header{Work Experience} + \vspace{1mm} + + \textbf{RingCentral} \hfill Belmont, CA\\ + \textit{AI Specialist} \hfill June 2023 - Present\\ + \vspace{-1mm} +\begin{itemize} \itemsep 1pt + \item Build and maintain an Autonomous Code-Driven Visualization Engine Proof-of-Concept, leveraging Autonomous Agents, Langchain, and OpenAI APIs with prompt engineering and few-shot learning. + \item Increase first-try success in addressing customer questions by over 1000\% by developing a support-focused deflection chatbot. + \item Design and implement a new contact card feature for RingCentral, receiving positive feedback from RingCentral employees. + \item Work with the Product Team to architect a personal assistant, now in trial-stage with strong approval from C-level executives. +\end{itemize} + \textbf{SproutLabs, LLC} \hfill Santa Cruz, California, United States\\ + \textit{Software Engineer Intern} \hfill January 2023 - June 2023\\ + \vspace{-1mm} +\begin{itemize} \itemsep 1pt + \item Collaborated in cross-functional team of 3 in architecting an intuitive, user-centric wireframe, enhancing user experience. + \item Engineered an administrative dashboard with real-time back-end integration, featuring multi-faceted tables and Google Maps for streamlined device oversight. + \item Implemented comprehensive unit and end-to-end testing across five screen sizes and multiple browsers, utilizing Playwright and Vitest to ensure optimal functionality. +\end{itemize} + +\header{Skills} +\begin{tabular}{ l l } +Programming Languages: & C/C++, Java, Python, Dart, Javascript, Typescript \\ +ML Libraries: & Tensorflow, Keras, NumPy, Pandas, Scikit Learn, OpenCV \\ +Visualization/Other Libraries: & MatplotLib, FastAPI, Flask, NextJS, OpenAI, Azure, GCP, PostgreSQL \\ +\end{tabular} +\vspace{2mm} + +\header{Projects} + {\textbf{Slug Loop}} {\sl React, Material UI, ExpressJS, C, Azure} \hfill https://www.slugloop.tech\\ + \vspace{-1mm} +\begin{itemize} \itemsep 1pt + \item Real-time UCSC loop bus tracker development + \item Utilized Radio Transmitters, Raspberry PIs, and C programming + \item Increased route efficiency, serving 50 daily users + \item GDSC Global Top 10 Finalist among 2000 teams +\end{itemize} + \vspace*{2mm} + {\textbf{WebWeaver}} {\sl NextJs, FastAPI, GPT Vision, Material UI, Redis} \hfill https://webweaver.biz\\ + \vspace{-1mm} +\begin{itemize} \itemsep 1pt + \item AI-powered website generation tool + \item Real-time, AI-assisted design and editing features +\end{itemize} + \vspace*{2mm} + {\textbf{Paddy Plant Prognosis}} {\sl Tensorflow, Vite, Flask, TailwindCSS} \hfill https://www.paddyplantprognosis.tech/ https://github.com/IdkwhatImD0ing/PaddyPlantPrognosis/blob/main/modelv2.ipynb\\ + \vspace{-1mm} +\begin{itemize} \itemsep 1pt + \item App development for identifying paddy crop diseases + \item Utilized computer vision, 97\% accuracy with Mobile Net Transfer Learning +\end{itemize} + \vspace*{2mm} + {\textbf{Sink or Swim}} {\sl NextJS, Flask, Tensorflow, TailwindCSS, OpenAI, Framer Motion} \hfill https://sos.art3m1s.me/ https://github.com/simon-quach/sink-or-swim/blob/main/titanic.ipynb\\ + \vspace{-1mm} +\begin{itemize} \itemsep 1pt + \item Web app predicting Titanic survival chances + \item Generated narratives, custom RNN with 84\% accuracy +\end{itemize} + \vspace*{2mm} + {\textbf{ASL Recognition}} {\sl Tensorflow, Pandas, Sklearn, NumPy, Keras} \hfill https://github.com/IdkwhatImD0ing/Kaggle/blob/main/SignLanguage/MobileOther.py\\ + \vspace{-1mm} +\begin{itemize} \itemsep 1pt + \item Machine learning-based Snapchat filter for ASL recognition + \item 91.6\% test accuracy using MobileNetV2 for transfer learning +\end{itemize} + \vspace*{2mm} + +\header{Relevant Coursework} + \textbf{Artificial Intelligence, Applied Machine Learning, Computer Vision}\\ + +\vspace*{2mm} + + \ + \end{document} \ No newline at end of file diff --git a/src/components/core/Icon.tsx b/src/components/core/Icon.tsx new file mode 100644 index 00000000..7004a0e4 --- /dev/null +++ b/src/components/core/Icon.tsx @@ -0,0 +1,31 @@ +import React from 'react' +import styled from 'styled-components' + +type Props = { + type: string + size?: number + color?: string +} + +interface StyledIconProps { + size?: number + color?: string +} + +const StyledIcon = styled.i<StyledIconProps>` + font-size: ${(props) => `${props.size || 14}px`}; + color: ${(props) => props.color || 'white'}; + display: flex; + justify-content: center; + align-items: center; +` + +function Icon({ type, size, color }: Props) { + return ( + <StyledIcon className="material-icons" size={size} color={color}> + {type} + </StyledIcon> + ) +} + +export default Icon diff --git a/src/components/core/Toolbar.tsx b/src/components/core/Toolbar.tsx new file mode 100644 index 00000000..660c8fa9 --- /dev/null +++ b/src/components/core/Toolbar.tsx @@ -0,0 +1,118 @@ +import React from 'react' +import styled from 'styled-components' +import { darken } from 'polished' +import Icon from './Icon' +import { colors } from '../../theme' + +const Wrapper = styled.div` + width: calc(100% - 2px); + display: flex; + background: ${darken(0.02, colors.background)}; + justify-content: space-between; + align-items: center; + padding: 10px 0; + border-bottom: 1px solid ${colors.borders}; + border-radius: 2px; + user-select: none; + + @media screen and (max-width: 850px) { + flex-direction: column; + } +` + +interface ButtonGroupProps { + hideOnMobile?: boolean +} + +const ButtonGroup = styled.div<ButtonGroupProps>` + width: calc(100% / 3); + display: flex; + justify-content: center; + align-items: center; + + &:first-child { + justify-content: flex-start; + } + + &:last-child { + justify-content: flex-end; + } + + @media screen and (max-width: 850px) { + width: 100%; + justify-content: center; + align-items: center; + ${(props) => (props.hideOnMobile ? 'display: none;' : '')} &:first-child, + last-child { + justify-content: center; + } + } +` + +const Button = styled.a` + text-align: center; + text-decoration: none; + font-size: 12px; + display: inline-flex; + justify-content: center; + align-items: center; + height: 35px; + min-width: 65px; + background: transparent; + border-radius: 2px; + color: #ddd; + padding: 0 2px; + + i { + margin-right: 5px; + color: #ddd; + font-size: 20px; + } + + &:hover { + color: ${colors.primary}; + cursor: pointer; + + i { + color: ${colors.primary}; + } + } +` +const ToolButton = styled(Button)` + border-radius: 2px; + margin: 0 2px; + + @media screen and (max-width: 850px) { + border: 1px solid ${colors.borders}; + + i { + display: none; + } + } +` + +type Props = { + resumeURL: string + jsonURL?: string + downloadSource: () => Promise<void> +} + +function Toolbar({ resumeURL, jsonURL, downloadSource }: Props) { + return ( + <Wrapper> + <ButtonGroup> + <ToolButton href={resumeURL} download="resume.pdf"> + <Icon type="file_download" /> PDF + </ToolButton> + <ToolButton onClick={downloadSource}> + <Icon type="file_download" /> LaTeX + </ToolButton> + <ToolButton href={jsonURL} download="resume.json"> + <Icon type="file_download" /> JSON + </ToolButton> + </ButtonGroup> + </Wrapper> + ) +} + +export default Toolbar diff --git a/src/components/generator/form/Form.tsx b/src/components/generator/form/Form.tsx index 68659cf4..dea76ac6 100644 --- a/src/components/generator/form/Form.tsx +++ b/src/components/generator/form/Form.tsx @@ -1,8 +1,9 @@ -import { useCallback, useEffect } from 'react' +import { useCallback } from 'react' import { useRouter } from 'next/router' -import { FormProvider, useForm } from 'react-hook-form' +import { useFormContext } from 'react-hook-form' import { useAtom } from 'jotai' import styled from 'styled-components' +import { TemplatesSection } from './sections/TemplatesSection' import { ProfileSection } from './sections/ProfileSection' import { EducationSection } from './sections/EducationSection' import { WorkSection } from './sections/WorkSection' @@ -32,35 +33,16 @@ const StyledForm = styled.form` overflow: auto; ` -const initialFormValues = { - headings: {}, - sections: [], - selectedTemplate: 1 -} - export function Form() { const router = useRouter() const { section: currSection } = router.query const [resume, setResume] = useAtom(resumeAtom) - const formContext = useForm<FormValues>({ defaultValues: initialFormValues }) - - // TODO: move this to a custom react hook - useEffect(() => { - const lastSession = localStorage.getItem('jsonResume') - if (lastSession) { - // TODO: validate JSON schema using Zod - const jsonResume = JSON.parse(lastSession) as FormValues - formContext.reset(jsonResume) - } - const subscription = formContext.watch((data) => { - localStorage.setItem('jsonResume', JSON.stringify(data)) - }) - return () => subscription.unsubscribe() - }, [formContext]) + const formContext = useFormContext<FormValues>() const handleFormSubmit = useCallback(async () => { - const formValues = formContext.getValues() + const formValues = convertFormData(formContext.getValues()) + console.log(formValues) setResume({ ...resume, isLoading: true }) try { const newResumeUrl = await generateResume(formValues) @@ -71,20 +53,44 @@ export function Form() { }, [formContext, resume, setResume]) return ( - <FormProvider {...formContext}> - <StyledForm - id="resume-form" - onSubmit={formContext.handleSubmit(handleFormSubmit)} - // onChange={handleFormSubmit} - > - {!currSection && <ProfileSection />} - {currSection === 'basics' && <ProfileSection />} - {currSection === 'education' && <EducationSection />} - {currSection === 'work' && <WorkSection />} - {currSection === 'skills' && <SkillsSection />} - {currSection === 'awards' && <AwardSection />} - {currSection === 'projects' && <ProjectsSection />} - </StyledForm> - </FormProvider> + <StyledForm + id="resume-form" + onSubmit={formContext.handleSubmit(handleFormSubmit)} + // onChange={handleFormSubmit} + > + {!currSection && <ProfileSection />} + {currSection === 'templates' && <TemplatesSection />} + {currSection === 'basics' && <ProfileSection />} + {currSection === 'education' && <EducationSection />} + {currSection === 'work' && <WorkSection />} + {currSection === 'skills' && <SkillsSection />} + {currSection === 'awards' && <AwardSection />} + {currSection === 'projects' && <ProjectsSection />} + </StyledForm> ) } + +// Temporary function to convert form data to new format with highlights +function convertFormData(formData: FormValues) { + if (!formData.projects) return formData + const newProjects = [] + for (let i = 0; i < formData.projects.length; i++) { + if (formData.projects[i].description) { + const highlights = formData.projects[i].highlights || [] + highlights.push(formData.projects[i].description || '') + const newProject = { + ...formData.projects[i], + highlights: highlights + } + delete newProject.description + newProjects.push(newProject) + } else { + newProjects.push(formData.projects[i]) + } + } + + return { + ...formData, + projects: newProjects + } +} diff --git a/src/components/generator/form/img/1.png b/src/components/generator/form/img/1.png new file mode 100644 index 00000000..db8f039b Binary files /dev/null and b/src/components/generator/form/img/1.png differ diff --git a/src/components/generator/form/img/10.png b/src/components/generator/form/img/10.png new file mode 100644 index 00000000..c81da9ee Binary files /dev/null and b/src/components/generator/form/img/10.png differ diff --git a/src/components/generator/form/img/2.png b/src/components/generator/form/img/2.png new file mode 100644 index 00000000..8847de74 Binary files /dev/null and b/src/components/generator/form/img/2.png differ diff --git a/src/components/generator/form/img/3.png b/src/components/generator/form/img/3.png new file mode 100644 index 00000000..2362ab90 Binary files /dev/null and b/src/components/generator/form/img/3.png differ diff --git a/src/components/generator/form/img/4.png b/src/components/generator/form/img/4.png new file mode 100644 index 00000000..e86ff8a8 Binary files /dev/null and b/src/components/generator/form/img/4.png differ diff --git a/src/components/generator/form/img/5.png b/src/components/generator/form/img/5.png new file mode 100644 index 00000000..51ac5a93 Binary files /dev/null and b/src/components/generator/form/img/5.png differ diff --git a/src/components/generator/form/img/6.png b/src/components/generator/form/img/6.png new file mode 100644 index 00000000..818576bb Binary files /dev/null and b/src/components/generator/form/img/6.png differ diff --git a/src/components/generator/form/img/7.png b/src/components/generator/form/img/7.png new file mode 100644 index 00000000..4e6df797 Binary files /dev/null and b/src/components/generator/form/img/7.png differ diff --git a/src/components/generator/form/img/8.png b/src/components/generator/form/img/8.png new file mode 100644 index 00000000..8317b75d Binary files /dev/null and b/src/components/generator/form/img/8.png differ diff --git a/src/components/generator/form/img/9.png b/src/components/generator/form/img/9.png new file mode 100644 index 00000000..83901d59 Binary files /dev/null and b/src/components/generator/form/img/9.png differ diff --git a/src/components/generator/form/sections/TemplatesSection.tsx b/src/components/generator/form/sections/TemplatesSection.tsx new file mode 100644 index 00000000..925a223e --- /dev/null +++ b/src/components/generator/form/sections/TemplatesSection.tsx @@ -0,0 +1,116 @@ +import styled from 'styled-components' +import { useFormContext } from 'react-hook-form' +import { FormSection } from './FormSection' +import { Button } from '../../../core/Button' +import { colors } from '../../../../theme' +import FsLightbox from 'fslightbox-react' +import { useState, useEffect } from 'react' + +import image1 from '../img/1.png' +import image2 from '../img/2.png' +import image3 from '../img/3.png' +import image4 from '../img/4.png' +import image5 from '../img/5.png' +import image6 from '../img/6.png' +import image7 from '../img/7.png' +import image8 from '../img/8.png' +import image9 from '../img/9.png' +import image10 from '../img/10.png' +const images = [ + image1, + image2, + image3, + image4, + image5, + image6, + image7, + image8, + image9, + image10 +] + +const Grid = styled.div` + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 20px; + margin: 20px 0; + + @media screen and (max-width: 850px) { + grid-template-columns: 1fr; + } +` + +const Div = styled.div` + display: flex; + flex-direction: column; + align-items: center; +` + +interface StyledImageProps { + active: boolean +} + +const StyledImage = styled.img<StyledImageProps>` + position: relative; + border-radius: 3px; + color: #fff; + max-width: 100%; + transform: translateY(0); + transition: all 0.4s ease-out; + opacity: ${(props) => (props.active ? '1' : '0.65')}; + ${(props) => + props.active + ? 'box-shadow: 0 2px 20px #fff, 0 0 0 1px #fff;' + : ''} &:hover { + opacity: ${(props) => (props.active ? '1' : '0.9')}; + transform: translateY(-3px); + cursor: zoom-in; + } +` + +export function TemplatesSection() { + const { watch, setValue } = useFormContext() + const [lightboxImageIndex, setLightboxImageIndex] = useState(0) + const [lightboxOpen, setLightboxOpen] = useState(false) + + // Effect to toggle lightboxOpen whenever lightboxImageIndex changes + useEffect(() => { + setLightboxOpen((prev) => !prev) + }, [lightboxImageIndex]) + + const setIndex = (index: number) => { + setLightboxImageIndex(index) + } + + return ( + <FormSection title="Choose a template"> + <Grid> + {images.map((src, i) => ( + <Div key={i}> + <StyledImage + active={i + 1 === watch('selectedTemplate')} + src={src.src} + onClick={() => setIndex(i)} + /> + <Button + type="button" + onClick={() => setValue('selectedTemplate', i + 1)} + color={ + i + 1 === watch('selectedTemplate') + ? colors.silver + : colors.white + } + > + Template {i + 1} + </Button> + </Div> + ))} + </Grid> + <FsLightbox + toggler={lightboxOpen} + sources={[images[lightboxImageIndex].src]} + captions={[`Template ${lightboxImageIndex + 1}`]} + /> + </FormSection> + ) +} diff --git a/src/components/generator/form/sections/WorkSection.tsx b/src/components/generator/form/sections/WorkSection.tsx index 6466e93e..621ea96a 100644 --- a/src/components/generator/form/sections/WorkSection.tsx +++ b/src/components/generator/form/sections/WorkSection.tsx @@ -30,11 +30,7 @@ export function WorkSection() { label="Position" placeholder="Software Engineer" /> - <LabeledInput - name={`work.${index}.summary`} - label="Summary" - placeholder="lorem ipsum" - /> + <LabeledInput name={`work.${index}.startDate`} label="Start Date" diff --git a/src/components/generator/form/sections/projectsSection.tsx b/src/components/generator/form/sections/projectsSection.tsx index b72a471f..911be7b1 100644 --- a/src/components/generator/form/sections/projectsSection.tsx +++ b/src/components/generator/form/sections/projectsSection.tsx @@ -6,6 +6,7 @@ import { AddButton } from '../../../core/Button' import { Divider } from '../../../core/Divider' import { FormSection } from './FormSection' import Keywords from '../Keywords' +import Highlights from '../Highlights' export function ProjectsSection() { const { fields, append } = useFieldArray({ name: 'projects' }) @@ -25,10 +26,10 @@ export function ProjectsSection() { label="Project Name" placeholder="Piper Chat" /> - <LabeledInput - name={`projects.${index}.description`} - label="Project Description" - placeholder="A video chat app with great picture quality." + <Highlights + label="Project Details" + placeholder="Won CalHacks 2023" + name={`projects.${index}.highlights`} /> <LabeledInput name={`projects.${index}.url`} diff --git a/src/components/generator/preview/Preview.tsx b/src/components/generator/preview/Preview.tsx index 1d8de8d8..b539fd7c 100644 --- a/src/components/generator/preview/Preview.tsx +++ b/src/components/generator/preview/Preview.tsx @@ -2,7 +2,9 @@ import { useAtom } from 'jotai' import { useState, useCallback } from 'react' import { pdfjs, Document, Page } from 'react-pdf' import type { PDFDocumentProxy } from 'pdfjs-dist/types/src/display/api' +import { useFormContext } from 'react-hook-form' import styled from 'styled-components' +import Toolbar from '../../core/Toolbar' import { resumeAtom } from '../../../atoms/resume' const workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js` @@ -37,6 +39,7 @@ const ResumePage = styled(Page)` export function Preview() { const [resume] = useAtom(resumeAtom) + const { getValues } = useFormContext() const [, setPageCount] = useState(1) const [pageNumber] = useState(1) const [scale] = useState(document.body.clientWidth > 1440 ? 1.75 : 1) @@ -45,6 +48,40 @@ export function Preview() { setPageCount(pdf.numPages) }, []) + async function downloadSource(): Promise<void> { + try { + const response = await fetch('/api/generate-source', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(getValues()) // Assuming getValues() fetches your form data + }) + + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`) + } + + const blob = await response.blob() // Get the response as a blob + const url = URL.createObjectURL(blob) + const link = document.createElement('a') + link.href = url + link.download = 'source.zip' // Name the download as 'source.zip' + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + URL.revokeObjectURL(url) // Clean up the URL object + } catch (error) { + console.error('Error downloading the source:', error) + } + } + + function getJsonUrl(): string { + const json = JSON.stringify(getValues()) + const blob = new Blob([json], { type: 'application/json' }) + return URL.createObjectURL(blob) + } + return ( <Output> <PdfContainer> @@ -58,20 +95,28 @@ export function Preview() { loading="" /> </ResumeDocument> */} + {resume.url && ( - <ResumeDocument - file={resume.url} - onLoadSuccess={handleDocumentLoadSuccess} - loading="" - > - <ResumePage - pageNumber={pageNumber} - scale={scale} - renderAnnotationLayer={false} - renderTextLayer={false} - loading="" + <> + <Toolbar + resumeURL={resume.url} + jsonURL={getJsonUrl()} + downloadSource={downloadSource} /> - </ResumeDocument> + <ResumeDocument + file={resume.url} + onLoadSuccess={handleDocumentLoadSuccess} + loading="" + > + <ResumePage + pageNumber={pageNumber} + scale={scale} + renderAnnotationLayer={false} + renderTextLayer={false} + loading="" + /> + </ResumeDocument> + </> )} </PdfContainer> </Output> diff --git a/src/components/generator/templates/Templates.tsx b/src/components/generator/templates/Templates.tsx deleted file mode 100644 index c0ce916c..00000000 --- a/src/components/generator/templates/Templates.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import styled from 'styled-components' -import { colors, sizes } from '../../../theme' - -const Section = styled.section` - width: ${sizes.templatesSection.width}; - background: ${colors.background}; - border-left: 1px solid rgba(0, 0, 0, 0.5); - box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.1); - overflow-y: scroll; -` - -export function Templates() { - return <Section></Section> -} diff --git a/src/lib/templates/index.ts b/src/lib/templates/index.ts index fca8e09b..44237a52 100755 --- a/src/lib/templates/index.ts +++ b/src/lib/templates/index.ts @@ -22,7 +22,8 @@ import { import { FormValues, TemplateData } from '../../types' function resolveTemplatePath(templatePath: string) { - return path.resolve(process.cwd(), 'src/lib/templates' + templatePath) + console.log(path.resolve(process.cwd(), 'public/lib/templates' + templatePath)) + return path.resolve(process.cwd(), 'public/lib/templates' + templatePath) } /** @@ -46,6 +47,7 @@ export default function getTemplateData(data: FormValues): TemplateData { } case TEMPLATE2: + return { texDoc: template2(data), opts: { diff --git a/src/lib/templates/template1/index.ts b/src/lib/templates/template1/index.ts index cce47d12..44ad9843 100755 --- a/src/lib/templates/template1/index.ts +++ b/src/lib/templates/template1/index.ts @@ -40,58 +40,58 @@ const generator: Generator = { %==== Education ====% \\header{${heading || 'Education'}} ${education.map((school) => { - const { - institution, - location, - studyType, - area, - score, - startDate, - endDate - } = school - - let line1 = '' - let line2 = '' - - if (institution) { - line1 += `\\textbf{${institution}}` - } + const { + institution, + location, + studyType, + area, + score, + startDate, + endDate + } = school + + let line1 = '' + let line2 = '' + + if (institution) { + line1 += `\\textbf{${institution}}` + } - if (location) { - line1 += `\\hfill ${location}` - } + if (location) { + line1 += `\\hfill ${location}` + } - if (studyType) { - line2 += studyType - } + if (studyType) { + line2 += studyType + } - if (area) { - line2 += studyType ? ` ${area}` : `Degree in ${area}` - } + if (area) { + line2 += studyType ? ` ${area}` : `Degree in ${area}` + } - if (score) { - line2 += ` \\textit{GPA: ${score}}` - } + if (score) { + line2 += ` \\textit{GPA: ${score}}` + } - if (startDate || endDate) { - const gradLine = `${startDate || ''} - ${endDate || ''}` - line2 += line2 ? ` \\hfill ${gradLine}` : gradLine - } + if (startDate || endDate) { + const gradLine = `${startDate || ''} - ${endDate || ''}` + line2 += line2 ? ` \\hfill ${gradLine}` : gradLine + } - if (line1) { - line1 += '\\\\' - } + if (line1) { + line1 += '\\\\' + } - if (line2) { - line2 += '\\\\' - } + if (line2) { + line2 += '\\\\' + } - return stripIndent` + return stripIndent` ${line1} ${line2.trim()} \\vspace{2mm} ` - })} + })} ` }, @@ -106,50 +106,50 @@ const generator: Generator = { \\vspace{1mm} ${work.map((job) => { - const { name, position, location, startDate, endDate, highlights } = job + const { company, position, location, startDate, endDate, highlights } = job - let line1 = '' - let line2 = '' - let highlightLines = '' + let line1 = '' + let line2 = '' + let highlightLines = '' - if (name) { - line1 += `\\textbf{${name}}` - } + if (company) { + line1 += `\\textbf{${company}}` + } - if (location) { - line1 += ` \\hfill ${location}` - } + if (location) { + line1 += ` \\hfill ${location}` + } - if (position) { - line2 += `\\textit{${position}}` - } + if (position) { + line2 += `\\textit{${position}}` + } - if (startDate && endDate) { - line2 += ` \\hfill ${startDate} - ${endDate}` - } else if (startDate) { - line2 += ` \\hfill ${startDate} - Present` - } else if (endDate) { - line2 += ` \\hfill ${endDate}` - } + if (startDate && endDate) { + line2 += ` \\hfill ${startDate} - ${endDate}` + } else if (startDate) { + line2 += ` \\hfill ${startDate} - Present` + } else if (endDate) { + line2 += ` \\hfill ${endDate}` + } - if (line1) line1 += '\\\\' - if (line2) line2 += '\\\\' + if (line1) line1 += '\\\\' + if (line2) line2 += '\\\\' - if (highlights) { - highlightLines = source` + if (highlights) { + highlightLines = source` \\vspace{-1mm} \\begin{itemize} \\itemsep 1pt ${highlights.map((highlight) => `\\item ${highlight}`)} \\end{itemize} ` - } + } - return stripIndent` + return stripIndent` ${line1} ${line2} ${highlightLines} ` - })} + })} ` }, @@ -162,9 +162,9 @@ const generator: Generator = { \\header{${heading || 'Skills'}} \\begin{tabular}{ l l } ${skills.map((skill) => { - const { name = 'Misc', keywords = [] } = skill - return `${name}: & ${keywords.join(', ')} \\\\` - })} + const { name = 'Misc', keywords = [] } = skill + return `${name}: & ${keywords.join(', ')} \\\\` + })} \\end{tabular} \\vspace{2mm} ` @@ -176,44 +176,46 @@ const generator: Generator = { } return source` - \\header{${heading || 'Projects'}} - ${projects.map((project) => { - if (Object.keys(project).length === 0) { - return '' - } - - const { name, description, keywords, url } = project + \\header{${heading || 'Projects'}} + ${projects.map((project) => { + if (Object.keys(project).length === 0) { + return '' + } - let line1 = '' - let line2 = description || '' + const { name, highlights, keywords, url } = project - if (name) { - line1 += `{\\textbf{${name}}}` - } + let line1 = '' + let highlightLines = '' - if (keywords) { - line1 += ` {\\sl ${keywords.join(', ')}} ` - } + if (name) { + line1 += `{\\textbf{${name}}}` + } - if (url) { - line1 += `\\hfill ${url}` - } + if (keywords) { + line1 += ` {\\sl ${keywords.join(', ')}} ` + } - if (line1) { - line1 += '\\\\' - } + if (url) { + line1 += `\\hfill ${url}` + } - if (line2) { - line2 += '\\\\' - } + if (highlights && highlights.length > 0) { + highlightLines = source` + \\vspace{-1mm} + \\begin{itemize} \\itemsep 1pt + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + if (line1) line1 += '\\\\' // Only add line break if line1 exists + } - return stripIndent` - ${line1} - ${line2} - \\vspace*{2mm} - ` - })} - ` + return stripIndent` + ${line1} + ${highlightLines} + \\vspace*{2mm} + ` + })} + ` }, awardsSection(awards, heading) { @@ -224,32 +226,32 @@ const generator: Generator = { return source` \\header{${heading || 'Awards'}} ${awards.map((award) => { - const { title, summary, date, awarder } = award + const { title, summary, date, awarder } = award - let line1 = '' - let line2 = summary || '' + let line1 = '' + let line2 = summary || '' - if (title) { - line1 += `\\textbf{${title}}` - } + if (title) { + line1 += `\\textbf{${title}}` + } - if (awarder) { - line1 += ` \\hfill ${awarder}` - } + if (awarder) { + line1 += ` \\hfill ${awarder}` + } - if (date) { - line2 += ` \\hfill ${date}` - } + if (date) { + line2 += ` \\hfill ${date}` + } - if (line1) line1 += '\\\\' - if (line2) line2 += '\\\\' + if (line1) line1 += '\\\\' + if (line2) line2 += '\\\\' - return stripIndent` + return stripIndent` ${line1} ${line2} \\vspace*{2mm} ` - })} + })} ` }, diff --git a/src/lib/templates/template2/index.ts b/src/lib/templates/template2/index.ts index e55ee952..2103ddf9 100755 --- a/src/lib/templates/template2/index.ts +++ b/src/lib/templates/template2/index.ts @@ -61,35 +61,35 @@ const generator: Generator = { \\cvsection{${heading || 'Education'}} \\begin{cventries} ${education.map((school) => { - const { - institution, - location, - area, - studyType, - score, - startDate, - endDate - } = school - - let degreeLine - - if (studyType && area) { - degreeLine = `${studyType} in ${area}` - } else if (studyType || area) { - degreeLine = studyType || area - } + const { + institution, + location, + area, + studyType, + score, + startDate, + endDate + } = school + + let degreeLine + + if (studyType && area) { + degreeLine = `${studyType} in ${area}` + } else if (studyType || area) { + degreeLine = studyType || area + } - let dateRange + let dateRange - if (startDate && endDate) { - dateRange = `${startDate} – ${endDate}` - } else if (startDate) { - dateRange = `${startDate} – Present` - } else { - dateRange = endDate - } + if (startDate && endDate) { + dateRange = `${startDate} – ${endDate}` + } else if (startDate) { + dateRange = `${startDate} – Present` + } else { + dateRange = endDate + } - return stripIndent` + return stripIndent` \\cventry {${degreeLine || ''}} {${institution || ''}} @@ -97,7 +97,7 @@ const generator: Generator = { {${dateRange || ''}} {${score ? `GPA: ${score}` : ''}} ` - })} + })} \\end{cventries} \\vspace{-2mm} @@ -115,37 +115,46 @@ const generator: Generator = { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \\cvsection{${heading || 'Experience'}} \\begin{cventries} - ${work.map((job) => { - const { name, position, location, startDate, endDate, highlights } = job - - let dateRange - let dutyLines - - if (startDate && endDate) { - dateRange = `${startDate} – ${endDate}` - } else if (startDate) { - dateRange = `${startDate} – Present` - } else { - dateRange = endDate - } + ${work.map(job => { + const { + company, + position, + location, + startDate, + endDate, + highlights + } = job + + let dateRange = '' + let dutyLines = '' + + if (startDate && endDate) { + dateRange = `${startDate} – ${endDate}` + } else if (startDate) { + dateRange = `${startDate} – Present` + } else { + dateRange = endDate || '' + } - if (highlights) { - dutyLines = source` + if (highlights) { + dutyLines = source` \\begin{cvitems} - ${highlights.map((duty) => `\\item {${duty}}`)} + ${highlights.map(duty => `\\item {${duty}}`)} \\end{cvitems} ` - } + } - return stripIndent` + const final = stripIndent` \\cventry {${position || ''}} - {${name || ''}} + {${company || ''}} {${location || ''}} {${dateRange || ''}} {${dutyLines}} ` - })} + return final + + })} \\end{cventries} ` }, @@ -162,12 +171,12 @@ const generator: Generator = { {} {\\def\\arraystretch{1.15}{\\begin{tabular}{ l l } ${skills.map((skill) => { - const { name, keywords = [] } = skill - const nameLine = name ? `${name}: ` : '' - const detailsLine = `{\\skill{ ${keywords.join(', ') || ''}}}` + const { name, keywords = [] } = skill + const nameLine = name ? `${name}: ` : '' + const detailsLine = `{\\skill{ ${keywords.join(', ') || ''}}}` - return `${nameLine} & ${detailsLine} \\\\` - })} + return `${nameLine} & ${detailsLine} \\\\` + })} \\end{tabular}}} {} {} @@ -184,24 +193,31 @@ const generator: Generator = { } return source` - \\cvsection{${heading || 'Projects'}} - \\begin{cventries} - ${projects.map((project) => { - const { name, description, keywords = [], url } = project + \\cvsection{${heading || 'Projects'}} + \\begin{cventries} + ${projects.map((project) => { + const { name, highlights = [], keywords = [], url } = project + + const bulletPoints = highlights + .map((highlight) => `\\item {${highlight}}`) + .join('\n') - return stripIndent` + // Ensure that all LaTeX commands are properly closed + return stripIndent` \\cventry - {${description || ''}} - {${name || ''}} - {${keywords.join(', ') || ''}} - {${url || ''}} + {${name || ''}} % Project Name + {${keywords.join(', ') || ''}} % Keywords + {${url || ''}} % URL + {} % Empty field for compatibility {} - + \\begin{itemize} + ${bulletPoints} + \\end{itemize} \\vspace{-5mm} ` - })} - \\end{cventries} - ` + })} + \\end{cventries} + ` }, awardsSection(awards, heading) { @@ -213,16 +229,16 @@ const generator: Generator = { \\cvsection{${heading || 'Awards'}} \\begin{cvhonors} ${awards.map((award) => { - const { title, summary, date, awarder } = award + const { title, summary, date, awarder } = award - return stripIndent` + return stripIndent` \\cvhonor {${title || ''}} {${summary || ''}} {${awarder || ''}} {${date || ''}} ` - })} + })} \\end{cvhonors} ` }, @@ -280,8 +296,10 @@ function template2(values: FormValues) { const { headings = {} } = values return stripIndent` + \\errorcontextlines=5 ${generator.resumeHeader()} \\begin{document} + ${values.sections .map((section) => { switch (section) { diff --git a/src/lib/templates/template3/index.ts b/src/lib/templates/template3/index.ts index 2ac5c900..f4be4140 100755 --- a/src/lib/templates/template3/index.ts +++ b/src/lib/templates/template3/index.ts @@ -32,45 +32,45 @@ const generator: Generator = { \\begin{itemize}[leftmargin=*] ${education.map((school) => { - const { - institution = '', - location = '', - studyType = '', - area = '', - score = '', - startDate = '', - endDate = '' - } = school - - let formattedLocation = '' - - if (location) { - formattedLocation = location + '\\\\' - } + const { + institution = '', + location = '', + studyType = '', + area = '', + score = '', + startDate = '', + endDate = '' + } = school + + let formattedLocation = '' + + if (location) { + formattedLocation = location + '\\\\' + } - let degreeLine = '' + let degreeLine = '' - if (studyType && area) { - degreeLine = `${studyType} ${area}` - } else if (studyType || area) { - degreeLine = studyType || area - } + if (studyType && area) { + degreeLine = `${studyType} ${area}` + } else if (studyType || area) { + degreeLine = studyType || area + } - if (score) { - degreeLine += degreeLine ? `, GPA: ${score}` : `GPA: ${score}` - } + if (score) { + degreeLine += degreeLine ? `, GPA: ${score}` : `GPA: ${score}` + } - let dateRange = '' + let dateRange = '' - if (startDate && endDate) { - dateRange = `${startDate} | ${endDate}` - } else if (startDate) { - dateRange = `${startDate} | Present` - } else { - dateRange = endDate - } + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } - return stripIndent` + return stripIndent` \\item[] \\school {${institution || ''}} @@ -78,7 +78,7 @@ const generator: Generator = { {${degreeLine}} {${dateRange || ''}} ` - })} + })} \\end{itemize} ` @@ -95,37 +95,37 @@ const generator: Generator = { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \\begin{itemize}[leftmargin=*] ${work.map((job) => { - const { name, position, location, startDate, endDate, highlights } = job + const { company, position, location, startDate, endDate, highlights } = job - let dateRange - let dutyLines + let dateRange + let dutyLines - if (startDate && endDate) { - dateRange = `${startDate} | ${endDate}` - } else if (startDate) { - dateRange = `${startDate} | Present` - } else { - dateRange = endDate - } + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } - if (highlights) { - dutyLines = source` + if (highlights) { + dutyLines = source` \\begin{itemize} ${highlights.map((duty) => `\\item ${duty}`)} \\end{itemize} ` - } + } - return stripIndent` + return stripIndent` \\item[] \\job - {${name || ''}} + {${company || ''}} {${location || ''}} {${position || ''}} {${dateRange || ''}} ${dutyLines} ` - })} + })} \\end{itemize} ` }, @@ -142,9 +142,9 @@ const generator: Generator = { \\begin{itemize}[leftmargin=*] \\setlength\\itemsep{0em} ${skills.map((skill) => { - const { name = '', keywords = [] } = skill - return `\\item[] \\skill{${name}}{${keywords.join(', ')}}` - })} + const { name = '', keywords = [] } = skill + return `\\item[] \\skill{${name}}{${keywords.join(', ')}}` + })} \\end{itemize} ` }, @@ -155,28 +155,33 @@ const generator: Generator = { } return source` - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \\resheading{${heading || 'Projects'}} - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \\begin{itemize}[leftmargin=*] - ${projects.map((project) => { - const { name = '', description = '', keywords = [], url = '' } = project - - const descriptionWithNewline = description - ? `\\\\${description}` - : description - - return stripIndent` - \\item[] - \\project - {${name}} - {${keywords.join(', ')}} - {${url}} - {${descriptionWithNewline}} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\resheading{${heading || 'Projects'}} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\begin{itemize}[leftmargin=*] + ${projects.map((project) => { + const { name = '', highlights = [], keywords = [], url = '' } = project + + let highlightsWithNewline = '' + if (highlights && highlights.length) { + highlightsWithNewline = stripIndent` + \\begin{itemize} + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} ` - })} - \\end{itemize} - ` + } + + return stripIndent` + \\item[] + \\project + {${name}} + {${keywords.join(', ')}} + {${url}} + {${highlightsWithNewline}} + ` + })} + \\end{itemize} + ` }, awardsSection(awards, heading) { @@ -190,11 +195,11 @@ const generator: Generator = { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \\begin{itemize}[leftmargin=*] ${awards.map((award) => { - const { title = '', summary = '', date = '', awarder = '' } = award + const { title = '', summary = '', date = '', awarder = '' } = award - const summaryWithNewline = summary ? `\\\\${summary}` : summary + const summaryWithNewline = summary ? `\\\\${summary}` : summary - return stripIndent` + return stripIndent` \\item[] \\award {${title}} @@ -202,7 +207,7 @@ const generator: Generator = { {${awarder}} {${summaryWithNewline}} ` - })} + })} \\end{itemize} ` }, diff --git a/src/lib/templates/template4/index.ts b/src/lib/templates/template4/index.ts index fc4a590e..183219cb 100755 --- a/src/lib/templates/template4/index.ts +++ b/src/lib/templates/template4/index.ts @@ -69,63 +69,63 @@ const generator: Generator = { \\section{${heading || 'Education'}} \\raggedright ${education.map((school) => { - const { - institution, - location, - studyType, - area, - score, - startDate, - endDate - } = school - - let line1 = '' - let line2 = '' - - if (institution) { - line1 += `\\runsubsection{${institution}}` - } + const { + institution, + location, + studyType, + area, + score, + startDate, + endDate + } = school + + let line1 = '' + let line2 = '' + + if (institution) { + line1 += `\\runsubsection{${institution}}` + } - if (studyType && area) { - line1 += `\\descript{| ${studyType} ${area}}` - } else if (studyType) { - line1 += `\\descript{| ${studyType}}` - } else if (area) { - line1 += `\\descript{| ${area}}` - } + if (studyType && area) { + line1 += `\\descript{| ${studyType} ${area}}` + } else if (studyType) { + line1 += `\\descript{| ${studyType}}` + } else if (area) { + line1 += `\\descript{| ${area}}` + } - let dateRange + let dateRange - if (startDate && endDate) { - dateRange = `${startDate} - ${endDate}` - } else if (startDate) { - dateRange = `${startDate} - Present` - } else { - dateRange = endDate - } + if (startDate && endDate) { + dateRange = `${startDate} - ${endDate}` + } else if (startDate) { + dateRange = `${startDate} - Present` + } else { + dateRange = endDate + } - const locationAndDate = [location, dateRange] - .filter(Boolean) - .join(' | ') + const locationAndDate = [location, dateRange] + .filter(Boolean) + .join(' | ') - if (locationAndDate) { - line1 += `\\hfill \\location{${locationAndDate}}` - } + if (locationAndDate) { + line1 += `\\hfill \\location{${locationAndDate}}` + } - if (line1) { - line1 += '\\\\' - } + if (line1) { + line1 += '\\\\' + } - if (score) { - line2 += `GPA: ${score}\\\\` - } + if (score) { + line2 += `GPA: ${score}\\\\` + } - return ` + return ` ${line1} ${line2} \\sectionsep ` - })} + })} ` }, @@ -142,57 +142,57 @@ const generator: Generator = { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \\section{${heading || 'Experience'}} ${work.map((job) => { - const { - name, - position, - location, - startDate, - endDate = '', - highlights - } = job - - let line1 = '' - let dateRange = '' - let highlightLines = '' - - if (name) { - line1 += `\\runsubsection{${name}}` - } + const { + company, + position, + location, + startDate, + endDate = '', + highlights + } = job + + let line1 = '' + let dateRange = '' + let highlightLines = '' + + if (company) { + line1 += `\\runsubsection{${company}}` + } - if (position) { - line1 += `\\descript{| ${position}}` - } + if (position) { + line1 += `\\descript{| ${position}}` + } - if (startDate && endDate) { - dateRange = `${startDate} – ${endDate}` - } else if (startDate) { - dateRange = `${startDate} – Present` - } else { - dateRange = endDate - } + if (startDate && endDate) { + dateRange = `${startDate} – ${endDate}` + } else if (startDate) { + dateRange = `${startDate} – Present` + } else { + dateRange = endDate + } - if (location && dateRange) { - line1 += `\\hfill \\location{${location} | ${dateRange}}` - } else if (location) { - line1 += `\\hfill \\location{${location}}` - } else if (dateRange) { - line1 += `\\hfill \\location{${dateRange}}` - } + if (location && dateRange) { + line1 += `\\hfill \\location{${location} | ${dateRange}}` + } else if (location) { + line1 += `\\hfill \\location{${location}}` + } else if (dateRange) { + line1 += `\\hfill \\location{${dateRange}}` + } - if (highlights) { - highlightLines = source` + if (highlights) { + highlightLines = source` \\begin{tightemize} ${highlights.map((highlight) => `\\item ${highlight}`)} \\end{tightemize} ` - } + } - return stripIndent` + return stripIndent` ${line1} ${highlightLines} \\sectionsep ` - })} + })} ` }, @@ -211,9 +211,9 @@ const generator: Generator = { \\raggedright \\begin{tabular}{ l l } ${skills.map((skill) => { - const { name = '', keywords = [] } = skill - return `\\descript{${name}} & {\\location{${keywords.join(', ')}}} \\\\` - })} + const { name = '', keywords = [] } = skill + return `\\descript{${name}} & {\\location{${keywords.join(', ')}}} \\\\` + })} \\end{tabular} \\sectionsep ` @@ -225,48 +225,52 @@ const generator: Generator = { } return source` - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % Projects - % - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \\section{${heading || 'Projects'}} - \\raggedright - ${projects.map((project) => { - const { name, description, keywords, url } = project - - let line1 = '' - let line2 = '' - let line3 = '' - - if (name) { - line1 += `\\runsubsection{\\large{${name}}}` - } + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Projects + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \\section{${heading || 'Projects'}} + \\raggedright + ${projects.map((project) => { + const { name, highlights, keywords, url } = project + + let line1 = '' + let line2 = '' + let highlightLines = '' + + if (name) { + line1 += `\\runsubsection{\\large{${name}}}` + } - if (keywords) { - line2 += `\\descript{| ${keywords.join(', ')}}` - } + if (keywords) { + line2 += `\\descript{| ${keywords.join(', ')}}` + } - if (url) { - line2 += `\\hfill \\location{${url}}` - } + if (url) { + line2 += `\\hfill \\location{${url}}` + } - if (line2) { - line2 += '\\\\' - } + if (line2) { + line2 += '\\\\' + } - if (description) { - line3 += `${description}\\\\` - } + if (highlights) { + highlightLines = source` + \\begin{tightemize} + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{tightemize} + ` + } - return ` - ${line1} - ${line2} - ${line3} - \\sectionsep - ` - })} - ` + return ` + ${line1} + ${line2} + ${highlightLines} + \\sectionsep + ` + })} + ` }, awardsSection(awards, heading) { @@ -282,15 +286,15 @@ const generator: Generator = { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \\section{${heading || 'Awards'}} ${awards.map((award) => { - const { title, summary, date, awarder } = award - const info = [awarder, date].filter(Boolean).join(' | ') + const { title, summary, date, awarder } = award + const info = [awarder, date].filter(Boolean).join(' | ') - return stripIndent` + return stripIndent` \\runsubsection{\\large{${title || ''}}} \\descript{${info}} \\\\ ${summary ? `${summary}\\\\` : ''} \\sectionsep ` - })} + })} ` }, diff --git a/src/lib/templates/template5/index.ts b/src/lib/templates/template5/index.ts index 21fe08c3..af06252d 100755 --- a/src/lib/templates/template5/index.ts +++ b/src/lib/templates/template5/index.ts @@ -29,65 +29,65 @@ const generator: Omit<Generator, 'resumeHeader'> = { return source` \\section{${heading || 'EDUCATION'}} ${education.map((school, i) => { - const { - institution, - location, - studyType = '', - area = '', - score, - startDate, - endDate = '' - } = school - - let schoolLine = '' - let degreeLine = '' - - if (institution) { - schoolLine += `\\textbf{${institution}}, ` - } - - if (studyType && area) { - degreeLine = `${studyType} in ${area}` - } else if (studyType || area) { - degreeLine = studyType || area - } - - if (degreeLine) { - schoolLine += `{\\sl ${degreeLine}} ` - } - - if (score) { - schoolLine += `GPA: ${score}` - } - - let dateRange = '' - - if (startDate && endDate) { - dateRange = `${startDate} | ${endDate}` - } else if (startDate) { - dateRange = `${startDate} | Present` - } else { - dateRange = endDate - } - - if (dateRange) { - schoolLine += `\\hfill ${dateRange}` - } - - if (schoolLine) { - schoolLine += '\\\\' - } - - if (location) { - schoolLine += `${location}` - } - - if (i !== lastSchoolIndex) { - schoolLine += '\\\\\\\\' - } - - return schoolLine - })} + const { + institution, + location, + studyType = '', + area = '', + score, + startDate, + endDate = '' + } = school + + let schoolLine = '' + let degreeLine = '' + + if (institution) { + schoolLine += `\\textbf{${institution}}, ` + } + + if (studyType && area) { + degreeLine = `${studyType} in ${area}` + } else if (studyType || area) { + degreeLine = studyType || area + } + + if (degreeLine) { + schoolLine += `{\\sl ${degreeLine}} ` + } + + if (score) { + schoolLine += `GPA: ${score}` + } + + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } + + if (dateRange) { + schoolLine += `\\hfill ${dateRange}` + } + + if (schoolLine) { + schoolLine += '\\\\' + } + + if (location) { + schoolLine += `${location}` + } + + if (i !== lastSchoolIndex) { + schoolLine += '\\\\\\\\' + } + + return schoolLine + })} ` }, @@ -99,56 +99,56 @@ const generator: Omit<Generator, 'resumeHeader'> = { return source` \\section{${heading || 'EXPERIENCE'}} ${work.map((job) => { - const { - name, - position, - location, - startDate, - endDate = '', - highlights - } = job - - let jobLine = '' - let dateRange = '' - - if (name) { - jobLine += `\\textbf{${name}}, ` - } - - if (position) { - jobLine += `{\\sl ${position}}` - } - - if (startDate && endDate) { - dateRange = `${startDate} | ${endDate}` - } else if (startDate) { - dateRange = `${startDate} | Present` - } else { - dateRange = endDate - } - - if (dateRange) { - jobLine += `\\hfill ${dateRange}` - } - - if (jobLine) { - jobLine += '\\\\' - } - - if (location) { - jobLine += `${location}\\\\` - } - - if (highlights) { - jobLine += source` + const { + company, + position, + location, + startDate, + endDate = '', + highlights + } = job + + let jobLine = '' + let dateRange = '' + + if (company) { + jobLine += `\\textbf{${company}}, ` + } + + if (position) { + jobLine += `{\\sl ${position}}` + } + + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } + + if (dateRange) { + jobLine += `\\hfill ${dateRange}` + } + + if (jobLine) { + jobLine += '\\\\' + } + + if (location) { + jobLine += `${location}\\\\` + } + + if (highlights) { + jobLine += source` \\begin{itemize} \\itemsep 3pt ${highlights.map((highlight) => `\\item ${highlight}`)} \\end{itemize} ` - } + } - return jobLine - })} + return jobLine + })} ` }, @@ -161,9 +161,9 @@ const generator: Omit<Generator, 'resumeHeader'> = { \\section{${heading || 'SKILLS'}} \\begin{tabular}{@{}ll} ${skills.map((skill) => { - const { name, keywords = [] } = skill - return `\\textbf{${name || ''}}: & ${keywords.join(', ') || ''}\\\\` - })} + const { name, keywords = [] } = skill + return `\\textbf{${name || ''}}: & ${keywords.join(', ') || ''}\\\\` + })} \\end{tabular} ` }, @@ -174,35 +174,40 @@ const generator: Omit<Generator, 'resumeHeader'> = { } return source` - \\section{${heading || 'PROJECTS'}} - ${projects.map((project) => { - const { name, description, keywords = [], url } = project - - let projectLine = '' - - if (name) { - projectLine += `\\textbf{${name}}` - } - - if (keywords) { - projectLine += `, {\\sl ${keywords.join(', ')}}` - } + \\section{${heading || 'PROJECTS'}} + ${projects.map((project) => { + const { name, highlights, keywords = [], url } = project + + let projectLine = '' + + if (name) { + projectLine += `\\textbf{${name}}` + } + + if (keywords) { + projectLine += `, {\\sl ${keywords.join(', ')}}` + } + + if (highlights) { + projectLine += projectLine ? `\\\\` : '' + projectLine += source` + \\begin{itemize} \\itemsep 3pt + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + } - if (description) { - projectLine += projectLine ? `\\\\ ${description}` : description - } + if (url) { + projectLine += projectLine ? `\\\\ ${url}` : url + } - if (url) { - projectLine += projectLine ? `\\\\ ${url}` : url - } + if (projectLine) { + projectLine += '\\\\\\\\' + } - if (projectLine) { - projectLine += '\\\\\\\\' - } - - return projectLine - })} - ` + return projectLine + })} + ` }, awardsSection(awards, heading) { @@ -213,15 +218,14 @@ const generator: Omit<Generator, 'resumeHeader'> = { return source` \\section{${heading || 'AWARDS'}} ${awards.map((award) => { - const { title, summary, date, awarder } = award + const { title, summary, date, awarder } = award - return stripIndent` - \\textbf{${title || ''}}, {\\sl ${awarder || ''}} \\hfill ${ - date || '' + return stripIndent` + \\textbf{${title || ''}}, {\\sl ${awarder || ''}} \\hfill ${date || '' } \\\\ ${summary || ''} \\\\\\\\ ` - })} + })} ` } } @@ -240,34 +244,34 @@ function template5(values: FormValues) { \\begin{resume} \\vspace{-5mm} ${values.sections - .map((section) => { - switch (section) { - case 'education': - return generator.educationSection( - values.education, - headings.education - ) - - case 'work': - return generator.workSection(values.work, headings.work) - - case 'skills': - return generator.skillsSection(values.skills, headings.skills) - - case 'projects': - return generator.projectsSection( - values.projects, - headings.projects - ) - - case 'awards': - return generator.awardsSection(values.awards, headings.awards) - - default: - return '' - } - }) - .join('\n')} + .map((section) => { + switch (section) { + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection( + values.projects, + headings.projects + ) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n')} ${WHITESPACE} \\end{resume} \\end{document} diff --git a/src/lib/templates/template6/index.ts b/src/lib/templates/template6/index.ts index 964b93ae..b1311979 100644 --- a/src/lib/templates/template6/index.ts +++ b/src/lib/templates/template6/index.ts @@ -19,8 +19,8 @@ const generator: Omit<Generator, 'resumeHeader'> = { ${name && info.length > 1 ? '\\\\' : ''} \\vspace{2mm} {\\fontsize{1em}{1em}\\fontspec[Path = fonts/]{Montserrat-Light} ${info.join( - ' -- ' - )}} + ' -- ' + )}} \\end{center} ` }, @@ -37,43 +37,42 @@ const generator: Omit<Generator, 'resumeHeader'> = { \\chap{${heading ? heading.toUpperCase() : 'EDUCATION'}}{ ${education.map((school) => { - const { - institution = '', - location = '', - area = '', - studyType = '', - score = '', - startDate = '', - endDate = '' - } = school - - const degreeLine = [studyType, area].filter(Boolean).join(' ') - let dateRange = '' - - if (startDate && endDate) { - dateRange = `${startDate} – ${endDate}` - } else if (startDate) { - dateRange = `${startDate} – Present` - } else { - dateRange = endDate - } + const { + institution = '', + location = '', + area = '', + studyType = '', + score = '', + startDate = '', + endDate = '' + } = school + + const degreeLine = [studyType, area].filter(Boolean).join(' ') + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} – ${endDate}` + } else if (startDate) { + dateRange = `${startDate} – Present` + } else { + dateRange = endDate + } - return stripIndent` + return stripIndent` \\school {${institution}} {${dateRange}} {${degreeLine}} {${location}} - {${ - score - ? `\\begin{newitemize} + {${score + ? `\\begin{newitemize} \\item ${score ? `GPA: ${score}` : ''} \\end{newitemize}` - : '' - } + : '' + } } ` - })} + })} } ` }, @@ -89,43 +88,43 @@ const generator: Omit<Generator, 'resumeHeader'> = { \\chap{${heading ? heading.toUpperCase() : 'EXPERIENCE'}}{ ${work.map((job) => { - const { - name = '', - position = '', - location = '', - startDate = '', - endDate = '', - highlights = [] - } = job - - let dateRange = '' - let dutyLines = '' - - if (startDate && endDate) { - dateRange = `${startDate} – ${endDate}` - } else if (startDate) { - dateRange = `${startDate} – Present` - } else { - dateRange = endDate - } + const { + company = '', + position = '', + location = '', + startDate = '', + endDate = '', + highlights = [] + } = job + + let dateRange = '' + let dutyLines = '' + + if (startDate && endDate) { + dateRange = `${startDate} – ${endDate}` + } else if (startDate) { + dateRange = `${startDate} – Present` + } else { + dateRange = endDate + } - if (highlights) { - dutyLines = source` + if (highlights) { + dutyLines = source` \\begin{newitemize} ${highlights.map((duty) => `\\item {${duty}}`)} \\end{newitemize} ` - } + } - return stripIndent` + return stripIndent` \\job - {${name}} + {${company}} {${dateRange}} {${position}} {${location}} {${dutyLines}} ` - })} + })} } ` }, @@ -142,20 +141,20 @@ const generator: Omit<Generator, 'resumeHeader'> = { \\chap{${heading ? heading.toUpperCase() : 'SKILLS'}}{ \\begin{newitemize} ${skills.map((skill) => { - const { name = '', keywords = [] } = skill + const { name = '', keywords = [] } = skill - let item = '' + let item = '' - if (name) { - item += `${name}: ` - } + if (name) { + item += `${name}: ` + } - if (keywords.length > 0) { - item += keywords.join(', ') - } + if (keywords.length > 0) { + item += keywords.join(', ') + } - return `\\item ${item}` - })} + return `\\item ${item}` + })} \\end{newitemize} } ` @@ -167,33 +166,33 @@ const generator: Omit<Generator, 'resumeHeader'> = { } return source` - % Chapter: Projects - % ------------------------ + % Chapter: Projects + % ------------------------ - \\chap{${heading ? heading.toUpperCase() : 'PROJECTS'}}{ - - ${projects.map((project) => { - const { - name = '', - description = '', - keywords = [], - url = '' - } = project - - const descriptionWithNewline = description - ? `${description}\\\\` - : description - - return stripIndent` - \\project - {${name}} - {${keywords.join(', ')}} - {${url}} - {${descriptionWithNewline}} - ` - })} - } - ` + \\chap{${heading ? heading.toUpperCase() : 'PROJECTS'}}{ + + ${projects.map((project) => { + const { name = '', highlights = [], keywords = [], url = '' } = project + + const highlightsList = + highlights.length > 0 + ? stripIndent` + \\begin{newitemize} + ${highlights.map((highlight) => `\\item {${highlight}}`)} + \\end{newitemize} + ` + : '' + + return stripIndent` + \\project + {${name}} + {${keywords.join(', ')}} + {${url}} + {${highlightsList}} % Include the highlights list here + ` + })} + } + ` }, awardsSection(awards, heading) { @@ -208,16 +207,16 @@ const generator: Omit<Generator, 'resumeHeader'> = { \\chap{${heading ? heading.toUpperCase() : 'AWARDS'}}{ ${awards.map((award) => { - const { title = '', summary = '', awarder = '', date = '' } = award + const { title = '', summary = '', awarder = '', date = '' } = award - return stripIndent` + return stripIndent` \\award {${title}} {${date}} {${summary}} {${awarder}} ` - })} + })} } ` } diff --git a/src/lib/templates/template7/index.ts b/src/lib/templates/template7/index.ts index e0ad1a69..a1285f69 100755 --- a/src/lib/templates/template7/index.ts +++ b/src/lib/templates/template7/index.ts @@ -24,35 +24,35 @@ const generator: Generator = { return source` \\section{${heading || 'Education'}} ${education.map((school) => { - const { - institution, - studyType = '', - area = '', - score, - location, - startDate, - endDate = '' - } = school - - let degreeLine = '' - - if (studyType && area) { - degreeLine = `${studyType} in ${area}` - } else if (studyType || area) { - degreeLine = studyType || area - } - - let dateRange = '' - - if (startDate && endDate) { - dateRange = `${startDate} | ${endDate}` - } else if (startDate) { - dateRange = `${startDate} | Present` - } else { - dateRange = endDate - } - - return stripIndent` + const { + institution, + studyType = '', + area = '', + score, + location, + startDate, + endDate = '' + } = school + + let degreeLine = '' + + if (studyType && area) { + degreeLine = `${studyType} in ${area}` + } else if (studyType || area) { + degreeLine = studyType || area + } + + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } + + return stripIndent` \\cventry {${dateRange || ''}} {${degreeLine}} @@ -61,7 +61,7 @@ const generator: Generator = { {\\textit{${location || ''}}} {} ` - })} + })} ` }, @@ -73,44 +73,44 @@ const generator: Generator = { return source` \\section{${heading || 'Experience'}} ${work.map((job) => { - const { - name, - position, - location, - startDate, - endDate = '', - highlights - } = job - - let dateRange = '' - let highlightLines = '' - - if (startDate && endDate) { - dateRange = `${startDate} -- ${endDate}` - } else if (startDate) { - dateRange = `${startDate} -- Present` - } else { - dateRange = endDate - } - - if (highlights) { - highlightLines = source` + const { + company, + position, + location, + startDate, + endDate = '', + highlights + } = job + + let dateRange = '' + let highlightLines = '' + + if (startDate && endDate) { + dateRange = `${startDate} -- ${endDate}` + } else if (startDate) { + dateRange = `${startDate} -- Present` + } else { + dateRange = endDate + } + + if (highlights) { + highlightLines = source` \\begin{itemize}% ${highlights.map((highlight) => `\\item ${highlight}`)} \\end{itemize} ` - } + } - return stripIndent` + return stripIndent` \\cventry {${dateRange || ''}} {${position || ''}} - {${name || ''}} + {${company || ''}} {${location || ''}} {} {${highlightLines}} ` - })} + })} ` }, @@ -122,9 +122,9 @@ const generator: Generator = { return source` \\section{${heading || 'Skills'}} ${skills.map((skill) => { - const { name, keywords = [] } = skill - return `\\cvitem{${name || ''}}{${keywords.join(', ')}}` - })} + const { name, keywords = [] } = skill + return `\\cvitem{${name || ''}}{${keywords.join(', ')}}` + })} ` }, @@ -134,32 +134,33 @@ const generator: Generator = { } return source` - \\section{${heading || 'Projects'}} - ${projects.map((project) => { - const { name, description, keywords = [], url } = project - - let detailsLine = '' - - if (description) { - detailsLine += `${description}\\\\` - } - - if (url) { - detailsLine += url - } - - return stripIndent` - \\cventry - {} - {${name || ''}} - {} - {\\textit{${keywords.join(', ')}}} - {} - {${detailsLine}} - \\vspace{1mm} - ` - })} - ` + \\section{${heading || 'Projects'}} + ${projects.map((project) => { + const { name, highlights = [], keywords = [], url } = project + + let highlightLines = '' + + if (highlights) { + highlightLines = source` + \\begin{itemize}% + ${highlights.map((highlight) => `\\item ${highlight}`)} + \\end{itemize} + ` + } + + return stripIndent` + \\cventry + {} + {${name || ''}} + {} + {\\textit{${keywords.join(', ')}}} + {} + {${url || ''}} + {${highlightLines}} + \\vspace{1mm} + ` + })} + ` }, awardsSection(awards, heading) { @@ -170,19 +171,19 @@ const generator: Generator = { return source` \\section{${heading || 'Awards'}} ${awards.map((award) => { - const { title, summary, date, awarder } = award + const { title, summary, date, awarder } = award - let detailsLine = '' + let detailsLine = '' - if (summary) { - detailsLine += `${summary}\\\\` - } + if (summary) { + detailsLine += `${summary}\\\\` + } - if (awarder) { - detailsLine += awarder - } + if (awarder) { + detailsLine += awarder + } - return stripIndent` + return stripIndent` \\cventry {} {${title || ''}} @@ -192,7 +193,7 @@ const generator: Generator = { {${detailsLine}} \\vspace{1mm} ` - })} + })} ` }, diff --git a/src/lib/templates/template8/index.ts b/src/lib/templates/template8/index.ts index e07fd474..750da9f2 100755 --- a/src/lib/templates/template8/index.ts +++ b/src/lib/templates/template8/index.ts @@ -41,48 +41,47 @@ const generator: Generator = { return source` \\begin{cvsection}{${heading || 'Education'}} ${education.map((school) => { - const { - institution, - studyType = '', - area = '', - score, - location, - startDate, - endDate = '' - } = school - - let degreeLine = '' - - if (studyType && area) { - degreeLine = `${studyType} in ${area}.` - } else if (studyType || area) { - degreeLine = (studyType || area) + '.' - } - - let dateRange = '' - - if (startDate && endDate) { - dateRange = `${startDate} | ${endDate}` - } else if (startDate) { - dateRange = `${startDate} | Present` - } else { - dateRange = endDate - } - - if (score) { - degreeLine += ` GPA: ${score}` - } - - return stripIndent` - \\begin{cvsubsection}{${location || ''}}{${institution || ''}}{${ - dateRange || '' + const { + institution, + studyType = '', + area = '', + score, + location, + startDate, + endDate = '' + } = school + + let degreeLine = '' + + if (studyType && area) { + degreeLine = `${studyType} in ${area}.` + } else if (studyType || area) { + degreeLine = (studyType || area) + '.' + } + + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} | ${endDate}` + } else if (startDate) { + dateRange = `${startDate} | Present` + } else { + dateRange = endDate + } + + if (score) { + degreeLine += ` GPA: ${score}` + } + + return stripIndent` + \\begin{cvsubsection}{${location || ''}}{${institution || ''}}{${dateRange || '' }} \\begin{itemize} \\item ${degreeLine} \\end{itemize} \\end{cvsubsection} ` - })} + })} \\end{cvsection} ` }, @@ -95,43 +94,42 @@ const generator: Generator = { return source` \\begin{cvsection}{${heading || 'Experience'}} ${work.map((job) => { - const { - name, - position, - location, - startDate, - endDate = '', - highlights - } = job - - let dateRange = '' - let highlightLines = '' - - if (startDate && endDate) { - dateRange = `${startDate} -- ${endDate}` - } else if (startDate) { - dateRange = `${startDate} -- Present` - } else { - dateRange = endDate - } - - if (highlights) { - highlightLines = source` + const { + company, + position, + location, + startDate, + endDate = '', + highlights + } = job + + let dateRange = '' + let highlightLines = '' + + if (startDate && endDate) { + dateRange = `${startDate} -- ${endDate}` + } else if (startDate) { + dateRange = `${startDate} -- Present` + } else { + dateRange = endDate + } + + if (highlights) { + highlightLines = source` \\begin{itemize}% ${highlights.map((highlight) => `\\item ${highlight}`)} \\end{itemize} ` - } + } - return stripIndent` - \\begin{cvsubsection}{${position || ''}}{${name || ''}}{${ - dateRange || '' + return stripIndent` + \\begin{cvsubsection}{${position || ''}}{${company || ''}}{${dateRange || '' }} ${location || ''} ${highlightLines || ''} \\end{cvsubsection} ` - })} + })} \\end{cvsection} ` }, @@ -146,9 +144,9 @@ const generator: Generator = { \\begin{cvsubsection}{}{}{} \\begin{itemize} ${skills.map((skill) => { - const { name, keywords = [] } = skill - return `\\item ${name ? `${name}: ` : ''} ${keywords.join(', ') || ''}` - })} + const { name, keywords = [] } = skill + return `\\item ${name ? `${name}: ` : ''} ${keywords.join(', ') || ''}` + })} \\end{itemize} \\end{cvsubsection} \\end{cvsection} @@ -161,37 +159,40 @@ const generator: Generator = { } return source` - \\begin{cvsection}{${heading || 'Projects'}} - \\begin{cvsubsection}{}{}{} - \\begin{itemize} - \\setlength\\itemsep{3pt} - ${projects.map((project) => { - const { name, description, keywords = [], url } = project - - let line = '' - - if (name) { - line += `\\textbf{${name}} ` - } - - if (url) { - line += `(${url}) ` - } - - if (description) { - line += ` ${description}` - } - - if (keywords) { - line += ` ${keywords.join(', ')}` - } - - return `\\item ${line}` - })} - \\end{itemize} - \\end{cvsubsection} - \\end{cvsection} - ` + \\begin{cvsection}{${heading || 'Projects'}} + \\begin{cvsubsection}{}{}{} + \\begin{itemize} + \\setlength\\itemsep{3pt} + ${projects.map((project) => { + const { name, highlights = [], keywords = [], url } = project + + let line = '' + + if (name) { + line += `\\textbf{${name}} ` + } + + if (url) { + line += `(${url}) ` + } + + let highlightLines = '' + if (highlights.length) { + highlightLines = highlights + .map((highlight) => `\\item ${highlight}`) + .join('\n') + } + + if (keywords) { + line += ` ${keywords.join(', ')}` + } + + return `\\item ${line}\n${highlightLines}` + })} + \\end{itemize} + \\end{cvsubsection} + \\end{cvsection} + ` }, awardsSection(awards, heading) { @@ -205,28 +206,28 @@ const generator: Generator = { \\begin{itemize} \\setlength\\itemsep{3pt} ${awards.map((award) => { - const { title, summary, date, awarder } = award + const { title, summary, date, awarder } = award - let line = '' + let line = '' - if (title) { - line += `\\textbf{${title}} ` - } + if (title) { + line += `\\textbf{${title}} ` + } - if (awarder) { - line += `(${awarder}) ` - } + if (awarder) { + line += `(${awarder}) ` + } - if (summary) { - line += ` ${summary}` - } + if (summary) { + line += ` ${summary}` + } - if (date) { - line += ` ${date}` - } + if (date) { + line += ` ${date}` + } - return `\\item ${line}` - })} + return `\\item ${line}` + })} \\end{itemize} \\end{cvsubsection} \\end{cvsection} @@ -277,34 +278,34 @@ function template8(values: FormValues) { % Print the header \\makeheader ${values.sections - .map((section) => { - switch (section) { - case 'education': - return generator.educationSection( - values.education, - headings.education - ) - - case 'work': - return generator.workSection(values.work, headings.work) - - case 'skills': - return generator.skillsSection(values.skills, headings.skills) - - case 'projects': - return generator.projectsSection( - values.projects, - headings.projects - ) - - case 'awards': - return generator.awardsSection(values.awards, headings.awards) - - default: - return '' - } - }) - .join('\n')} + .map((section) => { + switch (section) { + case 'education': + return generator.educationSection( + values.education, + headings.education + ) + + case 'work': + return generator.workSection(values.work, headings.work) + + case 'skills': + return generator.skillsSection(values.skills, headings.skills) + + case 'projects': + return generator.projectsSection( + values.projects, + headings.projects + ) + + case 'awards': + return generator.awardsSection(values.awards, headings.awards) + + default: + return '' + } + }) + .join('\n')} ${WHITESPACE} \\end{document} ` diff --git a/src/lib/templates/template9/index.ts b/src/lib/templates/template9/index.ts index 5a05f78f..7ea96f77 100755 --- a/src/lib/templates/template9/index.ts +++ b/src/lib/templates/template9/index.ts @@ -32,53 +32,53 @@ const generator: Generator = { %%% ------------------------------------------------------------ \\NewPart{${heading || 'Education'}}{} ${education.map((school, i) => { - const { - institution = '', - studyType, - area = '', - score = '', - location = '', - startDate = '', - endDate = '' - } = school - - let degreeLine = '' - let nameLine = '' - - if (studyType && area) { - degreeLine = `${studyType} ${area}` - } else if (studyType || area) { - degreeLine = studyType || area - } - - let dateRange = '' - - if (startDate && endDate) { - dateRange = `${startDate} - ${endDate}` - } else if (startDate) { - dateRange = `${startDate} - Present` - } else { - dateRange = endDate - } - - if (institution && location) { - nameLine += `${institution}, ${location}` - } else if (institution || location) { - nameLine = institution || location - } - - if (score) { - nameLine += ` ${score}` - } - - return stripIndent` + const { + institution = '', + studyType, + area = '', + score = '', + location = '', + startDate = '', + endDate = '' + } = school + + let degreeLine = '' + let nameLine = '' + + if (studyType && area) { + degreeLine = `${studyType} ${area}` + } else if (studyType || area) { + degreeLine = studyType || area + } + + let dateRange = '' + + if (startDate && endDate) { + dateRange = `${startDate} - ${endDate}` + } else if (startDate) { + dateRange = `${startDate} - Present` + } else { + dateRange = endDate + } + + if (institution && location) { + nameLine += `${institution}, ${location}` + } else if (institution || location) { + nameLine = institution || location + } + + if (score) { + nameLine += ` ${score}` + } + + return stripIndent` \\EducationEntry {${degreeLine}} {${dateRange || ''}} {${nameLine}} ${i < lastSchoolIndex ? '\\sepspace' : ''} ` - })} + })} ` }, @@ -96,36 +96,36 @@ const generator: Generator = { \\NewPart{${heading || 'Experience'}}{} ${work.map((job, i) => { - const { - name, - position, - location, - startDate, - endDate = '', - highlights - } = job - - const nameLine = [name, location].filter(Boolean).join(', ') - let dateRange = '' - let dutyLines = '' - - if (startDate && endDate) { - dateRange = `${startDate} - ${endDate}` - } else if (startDate) { - dateRange = `${startDate} - Present` - } else { - dateRange = endDate - } - - if (highlights) { - dutyLines = source` + const { + company, + position, + location, + startDate, + endDate = '', + highlights + } = job + + const nameLine = [company, location].filter(Boolean).join(', ') + let dateRange = '' + let dutyLines = '' + + if (startDate && endDate) { + dateRange = `${startDate} - ${endDate}` + } else if (startDate) { + dateRange = `${startDate} - Present` + } else { + dateRange = endDate + } + + if (highlights) { + dutyLines = source` \\begin{itemize} \\itemsep -1pt ${highlights.map((duty) => `\\item ${duty}`)} \\end{itemize} ` - } + } - return stripIndent` + return stripIndent` \\WorkEntry {${position || ''}} {${dateRange || ''}} @@ -133,7 +133,7 @@ const generator: Generator = { {${dutyLines}} ${i < lastJobIndex ? '\\sepspace' : ''} ` - })} + })} ` }, @@ -147,9 +147,9 @@ const generator: Generator = { %%% ------------------------------------------------------------ \\NewPart{${heading || 'Skills'}}{} ${skills.map((skill) => { - const { name, keywords = [] } = skill - return `\\SkillsEntry{${name || ''}}{${keywords.join(', ')}}` - })} + const { name, keywords = [] } = skill + return `\\SkillsEntry{${name || ''}}{${keywords.join(', ')}}` + })} ` }, @@ -161,21 +161,30 @@ const generator: Generator = { const lastProjectIndex = projects.length - 1 return source` - %%% Projects - %%% ------------------------------------------------------------ - \\NewPart{${heading || 'Projects'}}{} - - ${projects.map((project, i) => { - const { name, description, keywords = [], url } = project - - return stripIndent` - \\ProjectEntry{${name || ''}}{${url || ''}} - {${keywords.join(', ')}} - {${description || ''}} - ${i < lastProjectIndex ? '\\sepspace' : ''} - ` - })} - ` + %%% Projects + %%% ------------------------------------------------------------ + \\NewPart{${heading || 'Projects'}}{} + + ${projects.map((project, i) => { + const { name, keywords = [], url, highlights = [] } = project + + const highlightList = + highlights.length > 0 + ? ` + \\begin{itemize} + ${highlights.map((highlight) => `\\item ${highlight}`).join('\n')} + \\end{itemize} + ` + : '' + + return stripIndent` + \\ProjectEntry{${name || ''}}{${url || ''}} + {${keywords.join(', ')}} + ${highlightList} + ${i < lastProjectIndex ? '\\sepspace' : ''} + ` + })} + ` }, awardsSection(awards, heading) { @@ -191,15 +200,15 @@ const generator: Generator = { \\NewPart{${heading || 'Awards'}}{} ${awards.map((award, i) => { - const { title, summary, date, awarder } = award + const { title, summary, date, awarder } = award - return stripIndent` + return stripIndent` \\AwardEntry{${title || ''}}{${awarder || ''}} {${date || ''}} {${summary || ''}} ${i < lastAwardIndex ? '\\sepspace' : ''} ` - })} + })} ` }, diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx new file mode 100644 index 00000000..38c888e8 --- /dev/null +++ b/src/pages/_document.tsx @@ -0,0 +1,18 @@ +import { Html, Head, Main, NextScript } from 'next/document' + +export default function Document() { + return ( + <Html> + <Head> + <link + href="https://fonts.googleapis.com/icon?family=Material+Icons" + rel="stylesheet" + /> + </Head> + <body> + <Main /> + <NextScript /> + </body> + </Html> + ) +} diff --git a/src/pages/api/generate-pdf.ts b/src/pages/api/generate-pdf.ts index 74cf7f03..16bc2a24 100644 --- a/src/pages/api/generate-pdf.ts +++ b/src/pages/api/generate-pdf.ts @@ -1,5 +1,6 @@ import type { NextApiRequest, NextApiResponse } from 'next' import latex from 'node-latex' +import fs from 'fs' import getTemplateData from '../../lib/templates' import { FormValues } from '../../types' @@ -17,6 +18,36 @@ export default async function handler( res.setHeader('Content-Type', 'application/pdf') } +function escapeLatexSpecialChars(str: string): string { + return str + .replace(/\\/g, '\\textbackslash') + .replace(/#/g, '\\#') + .replace(/\$/g, '\\$') + .replace(/%/g, '\\%') + .replace(/&/g, '\\&') + .replace(/_/g, '\\_') + .replace(/{/g, '\\{') + .replace(/}/g, '\\}') + .replace(/~/g, '\\textasciitilde') + .replace(/\^/g, '\\textasciicircum'); +} + +function cleanData(data: FormValues): FormValues { + data.projects?.forEach((project) => { + project.highlights = project.highlights?.map(highlight => + escapeLatexSpecialChars(highlight) + ); + }); + + data.work?.forEach((work) => { + work.highlights = work.highlights?.map(highlight => + escapeLatexSpecialChars(highlight) + ); + }); + + return data; +} + /** * Generates a LaTeX document from the request body, * and then generates a PDF from that document. @@ -26,8 +57,16 @@ export default async function handler( * @return The generated PDF. */ async function generatePDF(formData: FormValues) { - const { texDoc, opts } = getTemplateData(formData) - const pdf = await latex(texDoc, opts) - - return pdf + const cleanedData = cleanData(formData) + const { texDoc, opts } = getTemplateData(cleanedData) + try { + // Save tex fike + fs.writeFileSync('resume.tex', texDoc) + const pdf = latex(texDoc, opts) + return pdf + } catch (err) { + console.log(`Error generating PDF for template ${formData.selectedTemplate}`) + // Return Blank pdf + return latex('', opts) + } } diff --git a/src/pages/api/generate-source.ts b/src/pages/api/generate-source.ts index 9b3378bd..50b858be 100644 --- a/src/pages/api/generate-source.ts +++ b/src/pages/api/generate-source.ts @@ -20,6 +20,36 @@ export default async function handler( .setHeader('content-disposition', 'attachment; filename="resume.zip"') } +function escapeLatexSpecialChars(str: string): string { + return str + .replace(/\\/g, '\\textbackslash') + .replace(/#/g, '\\#') + .replace(/\$/g, '\\$') + .replace(/%/g, '\\%') + .replace(/&/g, '\\&') + .replace(/_/g, '\\_') + .replace(/{/g, '\\{') + .replace(/}/g, '\\}') + .replace(/~/g, '\\textasciitilde') + .replace(/\^/g, '\\textasciicircum'); +} + +function cleanData(data: FormValues): FormValues { + data.projects?.forEach((project) => { + project.highlights = project.highlights?.map(highlight => + escapeLatexSpecialChars(highlight) + ); + }); + + data.work?.forEach((work) => { + work.highlights = work.highlights?.map(highlight => + escapeLatexSpecialChars(highlight) + ); + }); + + return data; +} + /** * Generates resume source files from the request body, * and then saves it to a zip which is then sent to the client. @@ -29,7 +59,8 @@ export default async function handler( * @return The generated zip. */ function generateSourceCode(formData: FormValues) { - const { texDoc, opts } = getTemplateData(formData) + const cleanedData = cleanData(formData) + const { texDoc, opts } = getTemplateData(cleanedData) const prettyDoc = /*prettify(texDoc)*/ texDoc const zip = Archiver('zip') const readme = makeReadme(formData.selectedTemplate, opts.cmd) diff --git a/src/pages/generator.tsx b/src/pages/generator.tsx index b5cfe38c..ab078cc9 100644 --- a/src/pages/generator.tsx +++ b/src/pages/generator.tsx @@ -1,11 +1,11 @@ import dynamic from 'next/dynamic' import styled from 'styled-components' - +import { useEffect } from 'react' +import { FormProvider, useForm } from 'react-hook-form' +import { FormValues } from '../types' import { Form } from '../components/generator/form/Form' import { Header } from '../components/generator/layout/Header' import { Sidebar } from '../components/generator/layout/Sidebar' -// import { Templates } from '../components/generator/templates/Templates' - const Preview = dynamic( async () => (await import('../components/generator/preview/Preview')).Preview, { ssr: false } @@ -20,16 +20,45 @@ const Main = styled.main` 'sidebar form preview'; height: 100vh; ` +const initialFormValues = { + headings: {}, + sections: [ + 'templates', + 'profile', + 'education', + 'work', + 'skills', + 'projects', + 'awards' + ], + selectedTemplate: 1 +} export default function GeneratorPage() { + const formContext = useForm<FormValues>({ defaultValues: initialFormValues }) + // TODO: move this to a custom react hook + useEffect(() => { + const lastSession = localStorage.getItem('jsonResume') + if (lastSession) { + // TODO: validate JSON schema using Zod + const jsonResume = JSON.parse(lastSession) as FormValues + formContext.reset(jsonResume) + } + const subscription = formContext.watch((data) => { + localStorage.setItem('jsonResume', JSON.stringify(data)) + }) + return () => subscription.unsubscribe() + }, [formContext]) return ( <Main> - <Header /> - <Sidebar /> - <Form /> - <Preview /> - {/* <Templates /> */} - {/* <Footer /> */} + <FormProvider {...formContext}> + <Header /> + <Sidebar /> + <Form /> + <Preview /> + {/* <Templates /> */} + {/* <Footer /> */} + </FormProvider> </Main> ) } diff --git a/src/theme/colors.ts b/src/theme/colors.ts index 5102e3a9..1a472a0b 100644 --- a/src/theme/colors.ts +++ b/src/theme/colors.ts @@ -3,6 +3,7 @@ export const lightGray = '#121217' export const gray = '#161619' export const white = '#ffffff' export const green = '#22d7a6' +export const silver = '#c0c5ce' export const primary = green export const accent = green diff --git a/src/types.ts b/src/types.ts index f29ee0eb..ded5e930 100644 --- a/src/types.ts +++ b/src/types.ts @@ -102,7 +102,7 @@ export type Resume = { export type FormValues = Resume & { headings: { [K in keyof Resume]?: string } - sections: (keyof Resume | 'profile')[] + sections: (keyof Resume | 'profile' | 'templates' | string)[] //TODO: Fix this lmfao selectedTemplate: number }