> ## Documentation Index
> Fetch the complete documentation index at: https://resources.latex-cloud-studio.com/llms.txt
> Use this file to discover all available pages before exploring further.

# LaTeX CV/Resume Template

> Professional CV and resume templates for job applications. Clean, ATS-friendly designs with multiple layout options.

export const RenderedOutput = ({title = "Rendered output", ctaHref, ctaLabel = "Open LaTeX Cloud Studio", children}) => {
  const [isExpanded, setIsExpanded] = useState(false);
  const trackEditorCta = () => {
    const target = new URL(ctaHref, window.location.href);
    globalThis.posthog?.capture?.("docs_app_cta_clicked", {
      source_page: window.location.pathname,
      source_section: "rendered_output",
      cta_variant: "first_compiled_example",
      target_url: target.toString(),
      target_utm_source: target.searchParams.get("utm_source"),
      target_utm_medium: target.searchParams.get("utm_medium"),
      target_utm_campaign: target.searchParams.get("utm_campaign"),
      target_utm_content: target.searchParams.get("utm_content")
    }, {
      transport: "sendBeacon",
      send_instantly: true
    });
  };
  return <details className="rendered-output" onToggle={event => setIsExpanded(event.currentTarget.open)}>
      <summary className="rendered-output__summary">
        <span className="rendered-output__title">{title}</span>
        <span className="rendered-output__hint" aria-hidden="true">View compiled result</span>
      </summary>
      {isExpanded && <div className="rendered-output__content">
          {children}
          {ctaHref && <aside className="rendered-output__cta" aria-label="Continue in the LaTeX editor">
              <span>
                <strong>Ready to use this syntax?</strong>
                Continue in the browser editor when you want to adapt the example in a real project.
              </span>
              <a href={ctaHref} onClick={trackEditorCta}>{ctaLabel}<span aria-hidden="true"> →</span></a>
            </aside>}
        </div>}
    </details>;
};

export const LatexSource = ({filename, source}) => {
  const [copyStatus, setCopyStatus] = useState("Copy");
  const copySource = async () => {
    try {
      await navigator.clipboard.writeText(source);
      setCopyStatus("Copied");
    } catch {
      setCopyStatus("Select and copy");
    }
  };
  return <figure className="latex-source">
      <figcaption className="latex-source__header">
        <span className="latex-source__filename">{filename}</span>
        <button type="button" className="latex-source__copy" onClick={copySource} aria-live="polite">
          {copyStatus}
        </button>
      </figcaption>
      <pre className="latex-source__pre" aria-label={`LaTeX source: ${filename}`} tabIndex="0">
        <code className="language-latex">{source}</code>
      </pre>
    </figure>;
};

export const LatexPreview = ({src, alt, caption, width, height}) => {
  const minZoom = 1;
  const maxZoom = 3;
  const zoomStep = 0.5;
  const measureSvgContent = async (assetSrc, pageWidth, pageHeight) => {
    const cacheKey = "__latexCloudSvgContentBoxCache";
    const contentBoxCache = globalThis[cacheKey] ?? new Map();
    globalThis[cacheKey] = contentBoxCache;
    if (contentBoxCache.has(assetSrc)) return contentBoxCache.get(assetSrc);
    const measurement = (async () => {
      const assetUrl = new URL(assetSrc, window.location.href);
      if (assetUrl.origin !== window.location.origin) {
        throw new Error("Rendered output must use a same-origin SVG asset.");
      }
      const response = await fetch(assetUrl, {
        credentials: "same-origin"
      });
      if (!response.ok) throw new Error(`Rendered output request failed with ${response.status}.`);
      const source = await response.text();
      const documentNode = new DOMParser().parseFromString(source, "image/svg+xml");
      if (documentNode.querySelector("parsererror")) throw new Error("Rendered output is not valid SVG.");
      const sourceSvg = documentNode.documentElement;
      sourceSvg.querySelectorAll("script, foreignObject").forEach(node => node.remove());
      [sourceSvg, ...sourceSvg.querySelectorAll("*")].forEach(node => {
        [...node.attributes].forEach(attribute => {
          if ((/^on/i).test(attribute.name)) node.removeAttribute(attribute.name);
          if ((attribute.name === "href" || attribute.name === "xlink:href") && !attribute.value.startsWith("#")) {
            node.removeAttribute(attribute.name);
          }
        });
      });
      const measurementHost = document.createElement("div");
      measurementHost.className = "latex-preview__measurement-host";
      const measuredSvg = document.importNode(sourceSvg, true);
      measuredSvg.setAttribute("aria-hidden", "true");
      measurementHost.appendChild(measuredSvg);
      document.body.appendChild(measurementHost);
      try {
        const measuredElements = [...measuredSvg.children].filter(node => !["defs", "desc", "metadata", "style", "title"].includes(node.tagName.toLowerCase()));
        const elementBounds = measuredElements.map(node => node.getBBox()).filter(box => [box.x, box.y, box.width, box.height].every(Number.isFinite) && box.width > 0 && box.height > 0);
        if (elementBounds.length === 0) {
          throw new Error("Rendered output has no measurable visible content.");
        }
        const sortedBounds = [...elementBounds].sort((left, right) => left.y - right.y);
        const clusterGap = pageHeight * 0.045;
        const clusters = [];
        sortedBounds.forEach(box => {
          const current = clusters[clusters.length - 1];
          if (!current || box.y - current.bottom > clusterGap) {
            clusters.push({
              boxes: [box],
              bottom: box.y + box.height
            });
            return;
          }
          current.boxes.push(box);
          current.bottom = Math.max(current.bottom, box.y + box.height);
        });
        const contentClusters = clusters.filter(cluster => {
          const clusterBox = cluster.boxes.reduce((combined, box) => {
            const right = Math.max(combined.x + combined.width, box.x + box.width);
            const bottom = Math.max(combined.y + combined.height, box.y + box.height);
            const x = Math.min(combined.x, box.x);
            const y = Math.min(combined.y, box.y);
            return {
              x,
              y,
              width: right - x,
              height: bottom - y
            };
          });
          const centerY = clusterBox.y + clusterBox.height / 2;
          const isMarginFurniture = cluster.boxes.length <= 2 && clusterBox.width < pageWidth * 0.2 && clusterBox.height < pageHeight * 0.04 && (centerY < pageHeight * 0.08 || centerY > pageHeight * 0.8);
          return !isMarginFurniture;
        });
        const visibleBounds = (contentClusters.length > 0 ? contentClusters : clusters).flatMap(cluster => cluster.boxes);
        const bounds = visibleBounds.reduce((combined, box) => {
          const right = Math.max(combined.x + combined.width, box.x + box.width);
          const bottom = Math.max(combined.y + combined.height, box.y + box.height);
          const x = Math.min(combined.x, box.x);
          const y = Math.min(combined.y, box.y);
          return {
            x,
            y,
            width: right - x,
            height: bottom - y
          };
        });
        const clampValue = (value, minimum, maximum) => Math.min(maximum, Math.max(minimum, value));
        const padding = Math.max(8, Math.min(pageWidth, pageHeight) * 0.025);
        const x = clampValue(bounds.x - padding, 0, pageWidth);
        const y = clampValue(bounds.y - padding, 0, pageHeight);
        const right = clampValue(bounds.x + bounds.width + padding, 0, pageWidth);
        const bottom = clampValue(bounds.y + bounds.height + padding, 0, pageHeight);
        return {
          x,
          y,
          width: right - x,
          height: bottom - y
        };
      } finally {
        measurementHost.remove();
      }
    })();
    contentBoxCache.set(assetSrc, measurement);
    measurement.catch(() => contentBoxCache.delete(assetSrc));
    return measurement;
  };
  const renderPreviewAsset = ({contentBox: assetContentBox, loading}) => {
    if (!assetContentBox) {
      return <img className="latex-preview__asset" src={src} alt={alt} width={width} height={height} loading={loading} draggable="false" />;
    }
    return <svg className="latex-preview__asset" viewBox={`${assetContentBox.x} ${assetContentBox.y} ${assetContentBox.width} ${assetContentBox.height}`} preserveAspectRatio="xMidYMid meet" role="img" aria-label={alt}>
        <image href={src} x="0" y="0" width={width} height={height} />
      </svg>;
  };
  const [isOpen, setIsOpen] = useState(false);
  const [frameMode, setFrameMode] = useState("content");
  const [viewMode, setViewMode] = useState("fit");
  const [zoom, setZoom] = useState(minZoom);
  const [contentBox, setContentBox] = useState(null);
  const [measurementStatus, setMeasurementStatus] = useState("loading");
  const dialogRef = useRef(null);
  const closeButtonRef = useRef(null);
  const viewportRef = useRef(null);
  const previousFocusRef = useRef(null);
  const dragRef = useRef(null);
  useEffect(() => {
    let isCurrent = true;
    setMeasurementStatus("loading");
    measureSvgContent(src, width, height).then(box => {
      if (!isCurrent) return;
      setContentBox(box);
      setMeasurementStatus("ready");
    }).catch(() => {
      if (!isCurrent) return;
      setContentBox(null);
      setFrameMode("page");
      setMeasurementStatus("error");
    });
    return () => {
      isCurrent = false;
    };
  }, [height, src, width]);
  const closeViewer = useCallback(() => {
    setIsOpen(false);
  }, []);
  const openViewer = () => {
    previousFocusRef.current = document.activeElement;
    setFrameMode(contentBox ? "content" : "page");
    setViewMode("fit");
    setZoom(minZoom);
    setIsOpen(true);
  };
  const applyZoom = useCallback(nextZoom => {
    const boundedZoom = Math.min(maxZoom, Math.max(minZoom, nextZoom));
    setViewMode("custom");
    setZoom(boundedZoom);
  }, []);
  const zoomIn = useCallback(() => {
    applyZoom(viewMode === "fit" ? minZoom + zoomStep : zoom + zoomStep);
  }, [applyZoom, viewMode, zoom]);
  const zoomOut = useCallback(() => {
    applyZoom(viewMode === "fit" ? minZoom : zoom - zoomStep);
  }, [applyZoom, viewMode, zoom]);
  useEffect(() => {
    if (!isOpen) return undefined;
    const previousOverflow = document.body.style.overflow;
    document.body.style.overflow = "hidden";
    closeButtonRef.current?.focus();
    return () => {
      document.body.style.overflow = previousOverflow;
      previousFocusRef.current?.focus?.();
    };
  }, [isOpen]);
  useEffect(() => {
    if (!isOpen) return undefined;
    const handleKeyDown = event => {
      if (event.key === "Escape") {
        event.preventDefault();
        closeViewer();
        return;
      }
      if ((event.key === "+" || event.key === "=") && !event.metaKey && !event.ctrlKey) {
        event.preventDefault();
        zoomIn();
        return;
      }
      if (event.key === "-" && !event.metaKey && !event.ctrlKey) {
        event.preventDefault();
        zoomOut();
        return;
      }
      if (event.key !== "Tab" || !dialogRef.current) return;
      const focusable = [...dialogRef.current.querySelectorAll('button:not([disabled]), a[href], [tabindex]:not([tabindex="-1"])')];
      if (focusable.length === 0) return;
      const first = focusable[0];
      const last = focusable[focusable.length - 1];
      if (event.shiftKey && document.activeElement === first) {
        event.preventDefault();
        last.focus();
      } else if (!event.shiftKey && document.activeElement === last) {
        event.preventDefault();
        first.focus();
      }
    };
    window.addEventListener("keydown", handleKeyDown);
    return () => {
      window.removeEventListener("keydown", handleKeyDown);
    };
  }, [closeViewer, isOpen, zoomIn, zoomOut]);
  const startDrag = event => {
    if (event.button !== 0 || !viewportRef.current) return;
    const viewport = viewportRef.current;
    dragRef.current = {
      pointerId: event.pointerId,
      x: event.clientX,
      y: event.clientY,
      scrollLeft: viewport.scrollLeft,
      scrollTop: viewport.scrollTop
    };
    viewport.setPointerCapture(event.pointerId);
    viewport.dataset.dragging = "true";
  };
  const continueDrag = event => {
    const drag = dragRef.current;
    const viewport = viewportRef.current;
    if (!drag || !viewport || drag.pointerId !== event.pointerId) return;
    viewport.scrollLeft = drag.scrollLeft - (event.clientX - drag.x);
    viewport.scrollTop = drag.scrollTop - (event.clientY - drag.y);
  };
  const stopDrag = event => {
    const viewport = viewportRef.current;
    if (viewport?.hasPointerCapture(event.pointerId)) viewport.releasePointerCapture(event.pointerId);
    if (viewport) delete viewport.dataset.dragging;
    dragRef.current = null;
  };
  const activeContentBox = frameMode === "content" ? contentBox : null;
  const activeWidth = activeContentBox?.width ?? width;
  const activeHeight = activeContentBox?.height ?? height;
  const activeRatio = activeWidth / activeHeight;
  const inlineContentBox = measurementStatus === "ready" ? contentBox : null;
  const inlineWidth = inlineContentBox?.width ?? width;
  const inlineHeight = inlineContentBox?.height ?? height;
  const inlineGeometry = {
    aspectRatio: `${inlineWidth} / ${inlineHeight}`,
    maxWidth: `${30 * inlineWidth / inlineHeight}rem`
  };
  const imageStyle = viewMode === "fit" ? {
    aspectRatio: `${activeWidth} / ${activeHeight}`,
    width: "100%",
    maxWidth: `${Math.max(16, activeRatio * 78)}dvh`
  } : {
    aspectRatio: `${activeWidth} / ${activeHeight}`,
    width: `${zoom * 100}%`,
    maxWidth: "none"
  };
  const zoomLabel = viewMode === "fit" ? frameMode === "content" ? "Fit content" : "Full page" : `${Math.round(zoom * 100)}%`;
  return <figure className="latex-preview">
      <button type="button" className="latex-preview__trigger" onClick={openViewer} aria-haspopup="dialog" aria-label={`Open zoomable preview: ${alt}`}>
        <span className="latex-preview__page" style={inlineGeometry}>
          {measurementStatus === "loading" ? <span className="latex-preview__loading" role="status">Preparing compiled output…</span> : renderPreviewAsset({
    src,
    alt,
    width,
    height,
    contentBox: inlineContentBox,
    loading: "lazy"
  })}
        </span>
        <span className="latex-preview__trigger-label" aria-hidden="true">
          <span className="latex-preview__trigger-icon">⌕</span>
          Open viewer
        </span>
      </button>
      <figcaption className="latex-preview__caption">
        <span>
          {caption}
          {measurementStatus === "error" && <span className="latex-preview__status" role="status"> Content fit is unavailable; the complete vector page is shown.</span>}
        </span>
        <a href={src} target="_blank" rel="noreferrer" className="latex-preview__source-link">Open SVG</a>
      </figcaption>

      {isOpen && <div className="latex-preview__backdrop" onMouseDown={event => {
    if (event.target === event.currentTarget) closeViewer();
  }}>
          <section ref={dialogRef} className="latex-preview__dialog" role="dialog" aria-modal="true" aria-label={`Rendered LaTeX viewer: ${alt}`}>
            <header className="latex-preview__toolbar">
              <div className="latex-preview__identity">
                <span className="latex-preview__eyebrow">Compiled LaTeX</span>
                <span className="latex-preview__filename">{alt}</span>
              </div>
              <div className="latex-preview__controls" aria-label="Preview controls">
                <button type="button" className={frameMode === "content" && viewMode === "fit" ? "is-active" : undefined} disabled={!contentBox} onClick={() => {
    setFrameMode("content");
    setViewMode("fit");
    setZoom(minZoom);
  }}>
                  Fit content
                </button>
                <button type="button" className={frameMode === "page" && viewMode === "fit" ? "is-active" : undefined} onClick={() => {
    setFrameMode("page");
    setViewMode("fit");
    setZoom(minZoom);
  }}>
                  Full page
                </button>
                <span className="latex-preview__zoom-group">
                  <button type="button" onClick={zoomOut} disabled={viewMode === "fit" || zoom <= minZoom} aria-label="Zoom out">−</button>
                  <output aria-live="polite" aria-label="Current zoom">{zoomLabel}</output>
                  <button type="button" onClick={zoomIn} disabled={viewMode !== "fit" && zoom >= maxZoom} aria-label="Zoom in">+</button>
                </span>
                <a href={src} target="_blank" rel="noreferrer">Open SVG</a>
                <button ref={closeButtonRef} type="button" className="latex-preview__close" onClick={closeViewer} aria-label="Close rendered LaTeX viewer">
                  Close
                </button>
              </div>
            </header>
            <div ref={viewportRef} className="latex-preview__viewport" data-view-mode={viewMode} onPointerDown={startDrag} onPointerMove={continueDrag} onPointerUp={stopDrag} onPointerCancel={stopDrag}>
              <span className="latex-preview__dialog-page" style={imageStyle}>
                {renderPreviewAsset({
    src,
    alt,
    width,
    height,
    contentBox: activeContentBox
  })}
              </span>
            </div>
            <footer className="latex-preview__viewer-note">
              Compiler-generated vector output · Use +/− to zoom · Drag to pan · Esc to close
            </footer>
          </section>
        </div>}
    </figure>;
};

Create stunning, professional CVs and resumes that stand out. Our templates are ATS-friendly, customizable, and designed to highlight your achievements.

<Info>
  **Quick start**: Choose a template below and use its code-block copy button to take the complete CV or resume into your project.
</Info>

## Choose This Template When

* You need an ATS-friendly resume for job applications
* You want an academic CV with publications, teaching, and awards
* You want a clean starting point that is easier to adapt than building a layout from scratch

## Start in LaTeX Cloud Studio

<CardGroup cols={2}>
  <Card title="Open the Editor" icon="cloud" href="https://app.latex-cloud-studio.com/?utm_source=resources&utm_medium=card&utm_campaign=docs_open_app&utm_content=template_cv_open_editor">
    Paste one template into the editor, then rewrite the summary and experience bullets before changing the design.
  </Card>

  <Card title="CV and Resume Guide" icon="briefcase" href="/learn/latex/how-to/cv-resume">
    Use the workflow guide for role-specific structure, academic sections, and resume-length decisions.
  </Card>
</CardGroup>

## How to Adapt for Job Applications

1. Pick one template and keep total length role-appropriate (often one page for resumes).
2. Rewrite summary and bullet points to reflect measurable impact.
3. Tailor skills and keywords to each job description.
4. For academic paths, expand publications and teaching sections.
5. Use the companion [CV and resume guide](/learn/latex/how-to/cv-resume).

## Modern Professional CV

A clean, modern design perfect for most industries:

<LatexSource filename="cv-modern.tex" source={"\\documentclass[11pt,a4paper,sans]{moderncv}\n\n% Modern CV theme\n\\moderncvstyle{banking} % Options: casual, classic, banking, oldstyle, fancy\n\\moderncvcolor{blue}    % Options: blue, orange, green, red, purple, grey, black\n\n% Character encoding\n\\usepackage[utf8]{inputenc}\n\\usepackage[scale=0.85]{geometry}\n\n% Personal Information\n\\name{John}{Smith}\n\\title{Senior Software Engineer}\n\\address{123 Tech Street}{San Francisco, CA 94105}{USA}\n\\phone[mobile]{+1~(555)~123~4567}\n\\email{john.smith&#64;email.com}\n\\homepage{www.johnsmith.com}\n\\social[linkedin]{johnsmith}\n\\social[github]{johnsmith}\n\\social[twitter]{@johnsmith}\n\n% Photo (optional)\n% \\photo[70pt][0.4pt]{picture}\n\n\\begin{document}\n\\makecvtitle\n\n\\section{Professional Summary}\nExperienced software engineer with 8+ years developing scalable web applications.\nExpert in Python, JavaScript, and cloud technologies. Proven track record of leading\nteams and delivering high-impact projects on time and within budget.\n\n\\section{Experience}\n\n\\cventry{2020--Present}{Senior Software Engineer}{Tech Corp}{San Francisco, CA}{}{\n  \\begin{itemize}\n    \\item Led development of microservices architecture serving 10M+ users daily\n    \\item Reduced API response time by 40\\% through optimization and caching strategies\n    \\item Mentored team of 5 junior developers and conducted code reviews\n    \\item Technologies: Python, Django, React, AWS, Docker, Kubernetes\n  \\end{itemize}\n}\n\n\\cventry{2018--2020}{Software Engineer}{StartupXYZ}{San Francisco, CA}{}{\n  \\begin{itemize}\n    \\item Built RESTful APIs and real-time features using Node.js and Socket.io\n    \\item Implemented CI/CD pipeline reducing deployment time by 60\\%\n    \\item Collaborated with product team to deliver features improving user retention by 25\\%\n    \\item Technologies: JavaScript, Node.js, MongoDB, Redis, Jenkins\n  \\end{itemize}\n}\n\n\\cventry{2016--2018}{Junior Developer}{Digital Agency}{Los Angeles, CA}{}{\n  \\begin{itemize}\n    \\item Developed responsive websites for 20+ clients using modern frameworks\n    \\item Maintained and optimized existing codebases\n    \\item Participated in agile development process\n    \\item Technologies: HTML, CSS, JavaScript, PHP, MySQL\n  \\end{itemize}\n}\n\n\\section{Education}\n\\cventry{2012--2016}{Bachelor of Science in Computer Science}{University of California}{Berkeley, CA}{GPA: 3.8/4.0}{\n  \\begin{itemize}\n    \\item Dean's List: Fall 2014, Spring 2015\n    \\item Relevant Coursework: Data Structures, Algorithms, Software Engineering, Database Systems\n  \\end{itemize}\n}\n\n\\section{Technical Skills}\n\\cvitem{Languages}{Python, JavaScript, Java, C++, SQL}\n\\cvitem{Frameworks}{Django, React, Node.js, Express, Spring Boot}\n\\cvitem{Databases}{PostgreSQL, MongoDB, Redis, MySQL}\n\\cvitem{Cloud/DevOps}{AWS, Docker, Kubernetes, CI/CD, Terraform}\n\\cvitem{Tools}{Git, JIRA, VS Code, IntelliJ IDEA}\n\n\\section{Projects}\n\\cventry{2023}{Open Source Contributor}{AsyncAPI}{}{}{\n  Contributed to AsyncAPI specification and tooling. Implemented new features\n  for code generation improving developer experience.\n  \\newline{}\\textit{GitHub: github.com/asyncapi/asyncapi}\n}\n\n\\cventry{2022}{Personal Project}{Task Management API}{}{}{\n  Built RESTful API with authentication, real-time updates, and integrations.\n  Deployed on AWS with 99.9\\% uptime.\n  \\newline{}\\textit{Technologies: Python, FastAPI, PostgreSQL, Redis, AWS}\n}\n\n\\section{Certifications}\n\\cvitem{2023}{AWS Certified Solutions Architect - Professional}\n\\cvitem{2022}{Google Cloud Professional Cloud Developer}\n\\cvitem{2021}{Certified Kubernetes Administrator (CKA)}\n\n\\section{Awards \\& Achievements}\n\\cvitem{2023}{Employee of the Year - Tech Corp}\n\\cvitem{2022}{Best Innovation Award - Internal Hackathon}\n\\cvitem{2021}{Speaker at PyCon - \"Scaling Python Applications\"}\n\n\\section{Languages}\n\\cvitemwithcomment{English}{Native}{}\n\\cvitemwithcomment{Spanish}{Professional Working Proficiency}{}\n\\cvitemwithcomment{Mandarin}{Basic}{}\n\n\\end{document}"} />

<RenderedOutput title="Expected effect">
  <Info>
    This code is a contextual or intentionally partial LaTeX excerpt, not a self-contained compilable document. Its visible result depends on the surrounding document, so the documentation shows the expected role without inventing a standalone preview.
  </Info>
</RenderedOutput>

## Classic One-Page Resume

Perfect for US job applications with ATS optimization:

<LatexSource filename="resume-classic.tex" source={"\\documentclass[11pt,letterpaper]{article}\n\\usepackage[margin=0.75in]{geometry}\n\\usepackage{enumitem}\n\\usepackage{hyperref}\n\\usepackage[T1]{fontenc}\n\n% Disable page numbers\n\\pagestyle{empty}\n\n% Custom commands\n\\newcommand{\\resumeSection}[1]{\n  \\vspace{2mm}\n  {\\large\\textbf{#1}}\n  \\vspace{1mm}\n  \\hrule\n  \\vspace{2mm}\n}\n\n\\newcommand{\\resumeSubheading}[4]{\n  \\vspace{1mm}\n  \\begin{tabular*}{\\textwidth}[t]{l@{\\extracolsep{\\fill}}r}\n    \\textbf{#1} & #2 \\\\\n    \\textit{#3} & \\textit{#4} \\\\\n  \\end{tabular*}\n  \\vspace{-2mm}\n}\n\n\\newcommand{\\resumeItem}[1]{\n  \\item{#1}\n}\n\n\\begin{document}\n\n% Header\n\\begin{center}\n  {\\LARGE\\textbf{Jane Doe}} \\\\\n  \\vspace{2mm}\n  Seattle, WA | (555) 987-6543 | jane.doe&#64;email.com | linkedin.com/in/janedoe | github.com/janedoe\n\\end{center}\n\n\\resumeSection{PROFESSIONAL SUMMARY}\nResults-driven Marketing Manager with 6+ years of experience driving growth through data-driven strategies.\nProven track record of increasing brand awareness by 150\\% and generating \\$2M+ in revenue through integrated campaigns.\nExpert in digital marketing, content strategy, and team leadership.\n\n\\resumeSection{EXPERIENCE}\n\n\\resumeSubheading\n{Marketing Manager}{Seattle, WA}\n{TechStart Inc.}{Mar 2021 -- Present}\n\\begin{itemize}[leftmargin=*, labelindent=0pt, itemsep=-0.5mm]\n  \\resumeItem{Led cross-functional team of 8 to launch product rebrand, resulting in 45\\% increase in brand recognition}\n  \\resumeItem{Developed and executed digital marketing strategy increasing website traffic by 200\\% and leads by 150\\%}\n  \\resumeItem{Managed \\$1.5M annual marketing budget, optimizing spend to achieve 3:1 ROI across all channels}\n  \\resumeItem{Implemented marketing automation workflows improving lead nurturing efficiency by 60\\%}\n\\end{itemize}\n\n\\resumeSubheading\n{Senior Marketing Specialist}{Portland, OR}\n{Digital Solutions Co.}{Jun 2019 -- Feb 2021}\n\\begin{itemize}[leftmargin=*, labelindent=0pt, itemsep=-0.5mm]\n  \\resumeItem{Created content strategy resulting in 300\\% increase in organic search traffic over 18 months}\n  \\resumeItem{Managed social media presence across 5 platforms, growing followers by 10K+ and engagement by 85\\%}\n  \\resumeItem{Collaborated with sales team to develop materials contributing to \\$500K in new business}\n  \\resumeItem{Analyzed campaign performance using Google Analytics and provided actionable insights}\n\\end{itemize}\n\n\\resumeSubheading\n{Marketing Coordinator}{San Francisco, CA}\n{StartupABC}{Aug 2017 -- May 2019}\n\\begin{itemize}[leftmargin=*, labelindent=0pt, itemsep=-0.5mm]\n  \\resumeItem{Coordinated 20+ marketing campaigns from conception to execution}\n  \\resumeItem{Wrote compelling copy for websites, emails, and advertisements}\n  \\resumeItem{Assisted in organizing 5 industry events with 200+ attendees each}\n\\end{itemize}\n\n\\resumeSection{EDUCATION}\n\n\\resumeSubheading\n{Bachelor of Arts in Marketing}{Seattle, WA}\n{University of Washington}{Sep 2013 -- Jun 2017}\n\\begin{itemize}[leftmargin=*, labelindent=0pt, itemsep=-0.5mm]\n  \\resumeItem{GPA: 3.7/4.0 | Dean's List: 4 semesters}\n  \\resumeItem{Relevant Coursework: Digital Marketing, Consumer Behavior, Data Analytics, Brand Management}\n\\end{itemize}\n\n\\resumeSection{SKILLS}\n\n\\begin{itemize}[leftmargin=*, labelindent=0pt, itemsep=-0.5mm]\n  \\resumeItem{\\textbf{Marketing:} SEO/SEM, Content Marketing, Email Marketing, Social Media, PPC, Marketing Automation}\n  \\resumeItem{\\textbf{Analytics:} Google Analytics, Tableau, Excel, SQL, A/B Testing, Data Visualization}\n  \\resumeItem{\\textbf{Tools:} HubSpot, Salesforce, Mailchimp, Hootsuite, Adobe Creative Suite, WordPress}\n  \\resumeItem{\\textbf{Soft Skills:} Leadership, Strategic Planning, Project Management, Communication, Problem-Solving}\n\\end{itemize}\n\n\\resumeSection{CERTIFICATIONS \\& ACHIEVEMENTS}\n\n\\begin{itemize}[leftmargin=*, labelindent=0pt, itemsep=-0.5mm]\n  \\resumeItem{Google Analytics Certified (2023) | HubSpot Content Marketing Certified (2022)}\n  \\resumeItem{Marketing Excellence Award - TechStart Inc. (2022)}\n  \\resumeItem{Published Article: \"The Future of B2B Marketing\" - Marketing Weekly (2023)}\n\\end{itemize}\n\n\\end{document}"} />

<RenderedOutput title="Expected effect">
  <Info>
    This code is a contextual or intentionally partial LaTeX excerpt, not a self-contained compilable document. Its visible result depends on the surrounding document, so the documentation shows the expected role without inventing a standalone preview.
  </Info>
</RenderedOutput>

## Academic CV Template

Comprehensive template for academic positions:

<LatexSource filename="cv-academic.tex" source={"\\documentclass[11pt,a4paper]{article}\n\\usepackage[margin=1in]{geometry}\n\\usepackage{hyperref}\n\\usepackage{enumitem}\n\n\\begin{document}\n\n% Header\n\\begin{center}\n{\\LARGE\\textbf{Dr. Sarah Johnson}} \\\\\n\\vspace{3mm}\nDepartment of Computer Science \\\\\nUniversity of Excellence \\\\\n123 Academic Way, Boston, MA 02115 \\\\\nPhone: (555) 123-4567 | Email: sjohnson&#64;university.edu \\\\\nWeb: www.cs.university.edu/~sjohnson | ORCID: 0000-0000-0000-0000\n\\end{center}\n\n\\section*{Research Interests}\nMachine Learning, Natural Language Processing, Deep Learning, AI Ethics,\nComputational Linguistics, Neural Networks\n\n\\section*{Education}\n\\textbf{Ph.D. in Computer Science}, Massachusetts Institute of Technology, 2018 \\\\\n\\textit{Dissertation:} \"Deep Learning Approaches for Natural Language Understanding\" \\\\\n\\textit{Advisor:} Prof. John Smith\n\n\\textbf{M.S. in Computer Science}, Stanford University, 2014 \\\\\n\\textit{Thesis:} \"Statistical Methods in Machine Translation\"\n\n\\textbf{B.S. in Computer Science}, \\textit{Magna Cum Laude}, UC Berkeley, 2012 \\\\\n\\textit{GPA:} 3.9/4.0\n\n\\section*{Academic Appointments}\n\\textbf{Assistant Professor}, University of Excellence, 2019--Present \\\\\nDepartment of Computer Science\n\n\\textbf{Postdoctoral Researcher}, MIT CSAIL, 2018--2019 \\\\\nAdvisor: Prof. Jane Doe\n\n\\section*{Publications}\n\n\\subsection*{Peer-Reviewed Journal Articles}\n\\begin{enumerate}[leftmargin=*]\n\\item Johnson, S., Smith, J., \\& Doe, J. (2023). \"Transformer-based Models for Cross-lingual Understanding.\"\n\\textit{Journal of Artificial Intelligence Research}, 75, 123-145.\n\n\\item Johnson, S. \\& Lee, K. (2022). \"Ethical Considerations in Large Language Models.\"\n\\textit{AI \\& Society}, 37(3), 567-582.\n\n\\item Johnson, S. (2021). \"Attention Mechanisms in Neural Machine Translation: A Survey.\"\n\\textit{Computational Linguistics}, 47(2), 234-267.\n\\end{enumerate}\n\n\\subsection*{Conference Proceedings}\n\\begin{enumerate}[leftmargin=*, resume]\n\\item Johnson, S., et al. (2023). \"Few-shot Learning for Low-resource Languages.\"\nIn \\textit{Proceedings of ACL 2023}, pp. 1234-1245.\n\n\\item Johnson, S. \\& Wang, L. (2022). \"Robust NLP Systems for Domain Adaptation.\"\nIn \\textit{Proceedings of NeurIPS 2022}, pp. 567-578.\n\\end{enumerate}\n\n\\section*{Grants and Funding}\n\\textbf{NSF CAREER Award}, \"Advancing Multilingual NLP,\" \\$500,000, 2022--2027 \\\\\n\\textit{Role:} Principal Investigator\n\n\\textbf{Google Faculty Research Award}, \"AI for Social Good,\" \\$75,000, 2021 \\\\\n\\textit{Role:} Principal Investigator\n\n\\section*{Teaching Experience}\n\\textbf{University of Excellence} (2019--Present)\n\\begin{itemize}[leftmargin=*]\n\\item CS 521: Machine Learning (Graduate) - Fall 2023, Fall 2022\n\\item CS 321: Introduction to AI (Undergraduate) - Spring 2023, Spring 2022\n\\item CS 622: Advanced NLP (Graduate) - Fall 2021\n\\end{itemize}\n\n\\section*{Awards and Honors}\n\\begin{itemize}[leftmargin=*]\n\\item Best Paper Award, ACL 2023\n\\item Outstanding Teaching Award, University of Excellence, 2022\n\\item MIT Presidential Fellowship, 2014--2018\n\\end{itemize}\n\n\\section*{Service}\n\\textbf{Editorial Boards:} Associate Editor, Journal of AI Research (2021--Present)\n\n\\textbf{Program Committees:} ACL (2020--2023), NeurIPS (2021--2023), ICML (2022--2023)\n\n\\textbf{University Service:} Graduate Admissions Committee (2020--Present)\n\n\\section*{Selected Invited Talks}\n\\begin{itemize}[leftmargin=*]\n\\item \"The Future of Multilingual AI,\" Keynote at EMNLP 2023, Singapore\n\\item \"Ethics in NLP,\" Google AI Research, Mountain View, CA, 2022\n\\item \"Deep Learning for Languages,\" MIT CSAIL Seminar Series, 2021\n\\end{itemize}\n\n\\end{document}"} />

<RenderedOutput title="Expected effect">
  <Info>
    This code is a contextual or intentionally partial LaTeX excerpt, not a self-contained compilable document. Its visible result depends on the surrounding document, so the documentation shows the expected role without inventing a standalone preview.
  </Info>
</RenderedOutput>

## Customization Tips

### Color Schemes

<LatexSource filename="colors.tex" source={"% For moderncv\n\\moderncvcolor{blue}    % Professional\n\\moderncvcolor{green}   % Fresh\n\\moderncvcolor{orange}  % Creative\n\\moderncvcolor{red}     % Bold\n\n% Custom colors\n\\definecolor{customblue}{RGB}{0,102,204}\n\\definecolor{customgray}{RGB}{100,100,100}"} />

<RenderedOutput title="Expected effect">
  <Info>
    This code is a contextual or intentionally partial LaTeX excerpt, not a self-contained compilable document. Its visible result depends on the surrounding document, so the documentation shows the expected role without inventing a standalone preview.
  </Info>
</RenderedOutput>

### Font Options

<LatexSource filename="fonts.tex" source={"% Modern fonts\n\\usepackage{lmodern}\n\\usepackage{helvet}  % Helvetica\n\\usepackage{charter} % Charter\n\n% Sans-serif for modern look\n\\renewcommand{\\familydefault}{\\sfdefault}"} />

<RenderedOutput title="Expected effect">
  <Info>
    This is setup or structural LaTeX code. It changes available commands or document behavior, but it does not produce meaningful standalone page content by itself.
  </Info>
</RenderedOutput>

### Adding Icons

<LatexSource filename="icons.tex" source={"\\usepackage{fontawesome5}\n\n% Usage examples\n\\faPhone\\ (555) 123-4567\n\\faEnvelope\\ email&#64;example.com\n\\faLinkedin\\ linkedin.com/in/yourname\n\\faGithub\\ github.com/yourname\n\\faGlobe\\ www.yourwebsite.com"} />

<RenderedOutput title="Expected effect">
  <Info>
    This code is a contextual or intentionally partial LaTeX excerpt, not a self-contained compilable document. Its visible result depends on the surrounding document, so the documentation shows the expected role without inventing a standalone preview.
  </Info>
</RenderedOutput>

## ATS Optimization Tips

<Warning>
  **Essential for ATS Compatibility:**

  * Use standard section headings (Experience, Education, Skills)
  * Avoid tables, columns, or complex formatting for main content
  * Use standard fonts (Arial, Times New Roman, Calibri)
  * Save as .docx after creating PDF for online applications
  * Include keywords from job description
</Warning>

### Keyword Optimization

<LatexSource filename="example.tex" source={"% Include relevant keywords naturally\n\\section{Technical Skills}\n\\begin{itemize}\n  \\item Programming: Python (Expert), Java (Proficient), SQL (Proficient)\n  \\item Frameworks: Django, React, Spring Boot\n  \\item Tools: Git, Docker, Kubernetes, AWS\n\\end{itemize}"} />

<RenderedOutput title="Rendered output" ctaHref="https://app.latex-cloud-studio.com/?utm_source=resources&utm_medium=rendered_output&utm_campaign=docs_open_app&utm_content=templates_cv">
  <LatexPreview src="/images/rendered/templates-cv-07/page-1.svg" alt="Compiled PDF page 1 from example.tex" caption="Generated from the shown source with pdfLaTeX in the pinned LaTeXCloud TeX Live 2026 environment. The visible fragment is compiled inside the documented minimal article wrapper." width={595.276} height={841.89} />
</RenderedOutput>

## Design Variations

* Use the [Modern Professional CV](#modern-professional-cv) for a polished multi-section profile.
* Use the [Classic One-Page Resume](#classic-one-page-resume) for concise applications and ATS-friendly scanning.
* Use the [Academic CV Template](#academic-cv-template) for publications, teaching, grants, and research experience.

Start with the closest structure, copy its complete code block, and adapt typography only after the content is complete.

## Best Practices

<Tip>
  **Content Tips:**

  1. **Quantify achievements**: Use numbers and percentages
  2. **Action verbs**: Start bullets with strong verbs (Led, Developed, Increased)
  3. **Relevance**: Tailor content to each job application
  4. **Consistency**: Use consistent formatting and tense
  5. **Proofread**: Zero tolerance for typos in CVs/resumes
</Tip>

### Length Guidelines

* **Entry Level**: 1 page maximum
* **Mid-Career**: 1-2 pages
* **Senior/Executive**: 2-3 pages
* **Academic CV**: No limit (include all publications)

### Section Order

1. **Contact Information**
2. **Summary/Objective** (optional)
3. **Experience** (or Education if recent grad)
4. **Education**
5. **Skills**
6. **Additional Sections** (Certifications, Projects, etc.)

## Compilation Tips

```bash theme={null}
# Basic compilation
pdflatex cv.tex

# For moderncv (compile twice)
pdflatex cv.tex
pdflatex cv.tex

# With bibliography
pdflatex cv.tex
bibtex cv
pdflatex cv.tex
pdflatex cv.tex
```

## Related Resources

* [Article Template](/templates/article) - For academic publications
* [Thesis Template](/templates/thesis) - For dissertations
* [CV/Resume Guide](/learn/latex/how-to/cv-resume) - Tips for writing effective CVs

***

<Info>
  **Remember**: Your CV/resume is a marketing document, not an autobiography. Focus on achievements and value you bring to employers.
</Info>

Ready to create your perfect CV or resume? Choose a template above and customize it to highlight your unique qualifications!
